从转换后的UIImageView中裁剪UIImage

4
我正在让用户从相机中拍摄或从库中选择一张图片。我将这个图片显示在一个UIImageView中。现在,用户可以在一个边界框内缩放和定位图像,就像你使用UIImagePickerController时设置allowsEditingYES一样。
当用户满意结果并点击“完成”时,我想生成一个裁剪后的UIImage。问题在于使用CGImageCreateWithImageInRect时,它不考虑缩放。变换应用于imageView,如下所示:
CGAffineTransform transform = CGAffineTransformScale(self.imageView.transform, newScale, newScale);
[self.imageView setTransform:transform];

使用手势识别。

我猜测正在发生的是:UIImageView被缩放和移动,然后它将UIViewContentModeScaleAspectFit应用到它所持有的UIImage上,当我要求裁剪图像时,它会完全地进行裁剪而不考虑缩放和定位。我认为这是因为,如果我不对图片进行缩放或移动,而只是直接点击“完成”,那么裁剪就可以正常工作。

我通过以下方式裁剪图片:

- (UIImage *)cropImage:(UIImage*) img toRect:(CGRect)rect {

    CGFloat scale = [[UIScreen mainScreen] scale];

    if (scale>1.0) {        
        rect = CGRectMake(rect.origin.x*scale , rect.origin.y*scale, rect.size.width*scale, rect.size.height*scale);        
    }

    CGImageRef imageRef = CGImageCreateWithImageInRect([img CGImage], rect);
    UIImage *result = [UIImage imageWithCGImage:imageRef scale:self.imageView.image.scale orientation:self.imageView.image.imageOrientation];
    //    UIImage *result = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef);
    return result;
}

从我的主视图的子视图(类似于UIImagePickerController中的方形覆盖框)中传递一个cropRect。主UIView具有一个UIImageView进行缩放和一个显示裁剪矩形的UIView。

我该如何获得“所见即所得”的裁剪效果,以及必须考虑哪些因素。或者,如果我应该以不同的层次结构或比例实现建议。


我也遇到了同样的问题,你有解决方案吗? - Roei Nadam
有解决办法吗?我也遇到了同样的问题。 - Samuel Noyes
1个回答

0
尝试一个简单的技巧。苹果网站上有示例展示如何使用代码放大照片。一旦完成缩放,使用图形上下文获取边界视图的框架大小,并获取该图像。例如,Uiview包含滚动视图,其中包含缩放的图像。因此,滚动视图缩放,您的图像也会缩放,现在获取您的边界UIview的框架大小,并创建一个图像上下文,然后将其保存为新图像。如果这样说得通,请告诉我。
干杯 :)

嗨Sam,谢谢。我正试图在脑海中重新构想您的建议 - 我显示完整的图像,但只希望裁剪图像上叠加的“预览”正方形。使用scrollView方法,我不会得到相同的问题吗?也就是说,我仍然需要将图像放置在UIImageView中,然后将其添加到scrollView中 - 但边界裁剪框不在scrollView中,因为我希望它在用户移动/缩放图像时保持静态。谢谢。 - RickiG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接