CGImage裁剪不给指定的矩形

CGImage cropping doesn't give the specified rectangle

我有一个可以在上面作画的视图。我保存最小和最大 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)
        }
    }
}

我可能错过了有关裁剪方法的一些信息,但我没有发现任何有用的信息。

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


这不会成为您的屏幕快照的问题,但为了未来的读者,请注意 CGImage 裁剪的 CGRect 会受到图像旋转的影响,例如相机拍摄的人像图像。参见 imageOrientation。最重要的是,除了前面提到的 scale 问题之外,还要注意 CGImagewidthheight 可能与 [=10= 的 widthheight 翻转].

在你的

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

使图像具有正确的比例。