UIImageView基于UIView掩码的图像裁剪

时间:2013-03-20 08:10:26

标签: ios ios6 uiimageview uiimage

所以我有一个画布(UIView)和一个UIImageView,画布充当了imageview的面具

enter image description here

我正在使用UIGestureRecognizers来缩放和旋转画布下的UIImageView。

我想转换最终图像(在画布中显示为UIImage,一种解决方案是将画布转换为如下图像

UIGraphicsBeginImageContext(self.canvas.bounds.size);
[self.canvas.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *newCombinedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

现在这个工作正常但是这个解决方案的问题是图像被裁剪为画布的尺寸,因此分辨率非常低。

我探索的另一个选项是使用一些自定义UIImage类别来旋转和缩放。

[[[self.photoImage image] imageRotatedByDegrees:rotaton_angle] 
     imageAtRect:CGRectMake(x,y width,height)]

我需要提供旋转角度(UIGesture Delegate提供的旋转角度不是度数或弧度,那么有x,y,宽度,高度,我想这些需要根据某种尺度计算,(我做从UIGesture委托获取比例值,但它们对于此函数似乎不正确)

这里有许多解决方案,可以指导您在给定矩形的情况下进行裁剪和图像处理。但在我的情况下,矩形与图像的尺度不同,也涉及旋转。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

我设法解决了这个问题,这是我的解决方案,它绝对不是最干净的,但它确实有效。

我需要处理3件事,平移,缩放和旋转。

首先,我使用UIGestureRecognizer委托来获取所有3的UIGestureRecognizerStateEnded累积值。

然后为了轮换我刚刚使用了讨论的{II}类别<{3}}

    self.imagetoEdit = [self.imagetoEdit imageRotatedByRadians:total_rotation];

用于缩放(缩放)我使用了GPUImage(我在整个应用程序中使用它)

GPUImageTransformFilter *scaleFilter = [[GPUImageTransformFilter alloc] init];
[scaleFilter setAffineTransform:CGAffineTransformMakeScale(total_scale, total_scale)];
[scaleFilter prepareForImageCapture];
self.imagetoEdit = [scaleFilter imageByFilteringImage:self.imagetoEdit];

用于平移,我这样做。 (不是最干净的代码:S)也使用上面提到的UIImage + Categories。

CGFloat x_ = (translation_point.x/canvas.frame.size.width)*self.imagetoEdit.size.width;
CGFloat y_ = (translation_point.y/canvas.frame.size.height)*self.imagetoEdit.size.height;
CGFloat xx = 0;
CGFloat yy = 0;
CGFloat ww = self.imagetoEdit.size.width-x_;
CGFloat hh = self.imagetoEdit.size.height-y_;

if (translation_point.x < 0) {
    xx = x_*-1;
    ww = self.imagetoEdit.size.width + xx;
}

if (translation_point.y < 0) {
    yy = y_*-1;
    hh = self.imagetoEdit.size.height + yy;
}

CGRect cgrect = CGRectMake(xx,yy, ww, hh);
self.imagetoEdit = [self.imagetoEdit imageAtRect:cgrect];
一切似乎都有效。

答案 1 :(得分:1)

这可能会有所帮助...... Resizing a UIImage the right way

可能需要对ARC等进行一些更新......虽然我认为有人已经完成并将其发布在Github上。