【问题标题】:CGImage cropping doesn't give the specified rectangleCGImage 裁剪没有给出指定的矩形
【发布时间】:2019-10-04 15:17:31
【问题描述】:

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

我可能错过了一些关于裁剪方法的内容,但我没有发现任何有用的东西。

【问题讨论】:

  • 试试extension UIView { var image: UIImage { let imageRendererFormat = UIGraphicsImageRendererFormat() imageRendererFormat.scale = UIScreen.main.scale return UIGraphicsImageRenderer(bounds: bounds, format: imageRendererFormat).image { layer.render(in: $0.cgContext) } } }

标签: ios swift crop


【解决方案1】:

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


这对您的屏幕快照来说不是问题,但为了未来的读者,请注意CGImage 裁剪的CGRect 会受到图像旋转的影响,例如相机拍摄的人像图像。见imageOrientation。底线,除了前面提到的scale 问题外,还要注意CGImagewidthheight 可能与UIImage 的那些相反。

【讨论】:

  • 将矩形的所有参数与设备比例相乘可以解决问题。
【解决方案2】:

在你之后

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)

使图像具有正确的比例。

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 2018-05-14
    • 2019-03-14
    • 2014-02-03
    • 2012-01-03
    • 2013-09-13
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多