从缩放和旋转的UIImageView创建UIImage

时间:2013-09-11 16:28:48

标签: ios objective-c uiimageview uiimage scaling

我正在开发一款应用程序,其功能包括平移,缩放和旋转图像等。起初我实现了应用于图片的UIImageView的所有手势识别,然后我注意到实际图像保持不变 - 我需要对其进行修改。

我发现了一个关于SO处理这类问题的问题 - Creating a UIImage from a rotated UIImageView - 我实际上能够使用Magic Bullet Dave提供的代码。但是,由于我的应用程序不仅要支持旋转,还要支持缩放图像,我必须修改它。他基本上写了一个方法来返回一个CGRect,其中旋转的图像适合。问题是我无法缩放所说的CGRect以正确封装缩放图像。当我在应用程序中旋转图像(在模拟器中运行)然后观察为测试目的而保存的png版本时,CGRect剪切图像的顶角和底角 - 图像越接近旋转90度,越多它被修剪了。

这是返回CGRect的方法:

- (CGRect) getBoundingRectAfterRotation: (CGRect) rectangle byAngle: (CGFloat) angleOfRotation {

    // Calculate the width and height of the bounding rectangle using basic trig
    CGFloat newWidth = rectangle.size.width * fabs(cosf(angleOfRotation)) + rectangle.size.height * fabs(sinf(angleOfRotation));
    CGFloat newHeight = rectangle.size.height * fabs(cosf(angleOfRotation)) + rectangle.size.width * fabs(sinf(angleOfRotation));

    // Calculate the position of the origin
    CGFloat newX = rectangle.origin.x + ((rectangle.size.width - newWidth) / 2);
    CGFloat newY = rectangle.origin.y + ((rectangle.size.height - newHeight) / 2);

    // Create the new rectangle
    CGRect rotatedRect = CGRectMake(newX, newY, newWidth, newHeight);
    return CGRectApplyAffineTransform(rotatedRect, CGAffineTransformScale(originalState, theScale, theScale));
}

正如你所看到的,我试图获得旋转图像的CGRect并缩放它 - 无济于事。 然后用于创建实际图像:

CGFloat angle = totalAngle;
UIImage *viewImage;

// Get image width, height of the bounding rectangle
CGRect boundingRect = [self getBoundingRectAfterRotation: self.photoView.bounds byAngle:angle];

// Create a graphics context the size of the bounding rectangle
UIGraphicsBeginImageContext(boundingRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();

// Rotate and translate the context
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformScale(transform, theScale, -theScale);

CGContextConcatCTM(context, transform);

代码尚未清理,因为这显然没有完成 - 目前我通过使CGRect大于必要而做了一个解决方法,但我当然希望避免这种情况。

欢迎任何帮助。

0 个答案:

没有答案