我有此代码段,对我而言效果很好,它根据可拖动的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。查看以下屏幕截图以更好地理解我的问题:
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
}
但这是我得到的结果:
答案 0 :(得分:2)
您可以将Apple方法用于CGImage
https://developer.apple.com/documentation/coregraphics/cgimage/1454683-cropping
裁剪(至:)
使用包含在以下子区域中的数据创建位图图像 现有的位图图像。
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);