裁剪图像到CGRect始终从x:0和y:0开始

时间:2018-09-26 08:41:48

标签: ios swift uiimageview uiimage crop

我有此代码段,对我而言效果很好,它根据可拖动的UIImageView(称为cropOverlay)的大小来裁剪图像:

func cropImage() {
        let rect = CGRect(x: cropOverlay.frame.origin.x, y: cropOverlay.frame.origin.y, width: cropOverlay.frame.size.width, height: cropOverlay.frame.size.height)
        UIGraphicsBeginImageContextWithOptions(rect.size, true, 0.0)
        originalImgView.layer.render(in: UIGraphicsGetCurrentContext()!)
        imageToEdit = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()

        originalImgView.image = imageToEdit
        resizeImageViewToImageSize(originalImgView)
        cropOverlay.frame = originalImgView.frame

        print("cropOverlay: \(cropOverlay.frame)")
        print("originalImgView: \(originalImgView.frame)")
        print("imageToEdit: \(imageToEdit.size.width) - \(imageToEdit.size.height)\n")
    }

这是我在XCode控制台中得到的:

cropOverlay: (139.25111636459152, 154.66666666666663, 135.49776727081695, 426.66666666666674)
originalImgView: (139.25111636459152, 154.66666666666663, 135.49776727081695, 426.66666666666674)
imageToEdit: 134.33333333333334 - 423.0

因此,我的控制台日志显示了cropOverlay imageView的正确X和Y位置以及originalImageView帧数据。但是问题在于,即使控制台说它位于X:139和Y:154上,我将cropOverlay imageView移到哪里也没关系,我得到的图像从X.0和Y开始:0。查看以下屏幕截图以更好地理解我的问题:

之前
BEFORE...

在应用cropImage()函数之后
AFTER



PS:我的resizeImageViewToImageSize(originalImgView)函数只是根据我的originalImageView的UIImage大小调整其框架的大小并将其居中显示在屏幕上。
如您所见,裁剪的图像大小是正确的,但是它是从我的originla图像的X和Y = 0开始的。

我的代码在做什么错?

谢谢!


更新: 如下面的建议,我已经编辑了如下的cropImage()函数:

func cropImage() {

        let cutImageRef: CGImage = (originalImgView.image!.cgImage?.cropping(to: cropOverlay.frame))!
        imageToEdit = UIImage(cgImage: cutImageRef)

        originalImgView.image = imageToEdit
        resizeImageViewToImageSize(originalImgView)
        cropOverlay.frame = originalImgView.frame

}


但这是我得到的结果:

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

您可以将Apple方法用于CGImage

https://developer.apple.com/documentation/coregraphics/cgimage/1454683-cropping

  

裁剪(至:)

     

使用包含在以下子区域中的数据创建位图图像   现有的位图图像。

enter image description here 例如:

let cutImageRef: CGImage = originalImgView.image.cgImage?.cropping(to: cropOverlay.frame)
let croppedImage: UIImage = UIImage(cgImage: cutImageRef)

更新:

还应使用缩放比例,因为imageView的大小与图像的大小不同

if let image = imageView.image {
  let wScale = (image.size.width / imageView.frame.width) * UIScreen.main.scale
  let hScale = (image.size.height / imageView.frame.height) * UIScreen.main.scale
  ...
  // Create cropping area using scales
}

答案 1 :(得分:1)

UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)

第一个参数的类型是CGSize,而不是CGRect。您可以尝试以下方法:

CGImageRef sourceImageRef = [originalImageView.image CGImage];
CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
CGImageRelease(newImageRef);