我正在开发一款应用程序,其功能包括平移,缩放和旋转图像等。起初我实现了应用于图片的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大于必要而做了一个解决方法,但我当然希望避免这种情况。
欢迎任何帮助。