CGImage裁剪未给出指定的矩形

时间:2019-10-04 15:17:31

标签: ios swift crop

我有一个可以在上面绘画的视图。我保存了最小和最大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 个答案:

答案 0 :(得分:1)

您从UIImage检索UIView的方法将返回带有设备scale的图像。而且您的坐标可能以“点”为单位。但是CGImage坐标以像素为单位。您必须相应地转换坐标(按图像比例)。例如。如果您使用的是@ 3x设备,则在裁剪之前将这些值乘以原始图像的scale


这对于您的屏幕快照来说不是问题,但是为了将来的读者,请注意,CGRect作物中的CGImage会受到图像旋转的影响,例如相机拍摄的人像图像。参见imageOrientation。底线除了前面提到的scale问题外,还请注意,width的{​​{1}}和height可能会与{{1} }。

答案 1 :(得分:0)

在您

之后
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)

使图像具有合适的比例。