Обрезка CGImage не дает указанный прямоугольник - PullRequest
0 голосов
/ 04 октября 2019

У меня есть вид, где можно рисовать. Я сохраняю минимальные и максимальные координаты осей x и y, чтобы указать прямоугольник, в котором был нарисован. Я проверил, был ли прямоугольник правильным, добавив вид с рамкой, и все работало нормально. Но когда я обрезаю изображение в прямоугольнике, оно дает мне другую часть.

guard let cg_img = self.asImage().cgImage?.cropping(to: CGRect(x: minX, y: minY, width: maxX-minX, height: maxY-minY)) else { return }

Мой метод asImage:

extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

Я, вероятно, что-то упустил в методе обрезки,но я не нашел ничего полезного.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Ваш метод извлечения UIImage из UIView вернет изображение с scale устройства. И ваши координаты скорее всего в «точках». Но CGImage координаты в пикселях. Вам нужно будет соответственно преобразовать свои координаты (в соответствии с масштабом изображения). Например, если вы используете устройство @ 3x, перед кадрированием умножьте эти значения на scale исходного изображения.


Это не будет проблемой для снимков экрана, но дляради будущих читателей, пожалуйста, обратите внимание, что CGRect кадрирования CGImage будет зависеть от поворота изображения, например, портретных изображений, снятых камерой. См. imageOrientation. Итог, в дополнение к проблеме scale, отмеченной ранее, также следует помнить, что width и height CGImage могут быть отражены по сравнению с UIImage.

0 голосов
/ 04 октября 2019

после вашего

guard let cg_img = self.asImage().cgImage?.cropping(to: CGRect(x: minX, y: minY, width: maxX-minX, height: maxY-minY)) else { return }

просто сделайте это

let image = UIImage(cgImage: cg_img)
let imageView = UIImageView(image: image)
imageView.contentMode = .center
imageView.contentScaleFactor = UIScreen.main.scale
view.addSubview(imageView)

, чтобы изображение было в правильном масштабе.

...