11

所以我有一个画布(UIView)和一个 UIImageView,画布充当图像视图的蒙版

在此处输入图像描述

我正在使用 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 委托,但它们似乎不适合此功能)

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

任何帮助将不胜感激。

4

2 回答 2

2

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

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

首先,我使用 UIGestureRecognizer Delegate 来获取所有 3 个在 UIGestureRecognizerStateEnded 处递增的累积值。

然后对于旋转,我只使用了这里讨论的 UIImage 类别

    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];

一切似乎都有效。

于 2013-03-27T09:01:16.050 回答
1

这可能会有所帮助... 以正确的方式调整 UIImage 的大小

它可能需要对 ARC 等进行一些更新……尽管我认为有些人已经完成了它并将其发布在 Github 上。

于 2013-03-20T09:05:34.717 回答