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
问题之外,还要注意 CGImage
的 width
和 height
可能与 [=10= 的 width
和 height
翻转].
在你的
之后
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)
使图像具有正确的比例。
我有一个可以在上面作画的视图。我保存最小和最大 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
问题之外,还要注意 CGImage
的 width
和 height
可能与 [=10= 的 width
和 height
翻转].
在你的
之后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)
使图像具有正确的比例。