UIImageView:变换UIImage

hex*_*mal 4 transform core-graphics uiimageview ios

我正在使用这个旋转UIImageView:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
myImgView.transform = CGAffineTransformMakeRotation(angle*M_PI/180);
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

现在我想获得旋转图像.我可以这样做吗?我试图使用CGImageRotatedByAngle函数使用CoreGraphics来接受这个问题的答案,但它转换坐标slighlty不正确(最后我们得到标记为错误的第三个屏幕截图).如您所见,图像会丢失其原始大小并被裁剪.我的目标是获得像原始大小的中央镜头一样的图像并旋转指定的角度.我的意思是要求旋转形状的大小保持不变,但新图像当然要比初始大.

在此输入图像描述

hex*_*mal 10

好吧,我再次回答我自己的问题,希望它对未来的某些人有用......回到CGImageRotatedByAngle,因为我之前说它提供了几乎所需的效果,但是坐标系翻译序列必须略有改变.这是我得到预期结果的方式:

- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle {

    CGFloat angleInRadians = angle * (M_PI / 180);
    CGFloat width = CGImageGetWidth(imgRef);
    CGFloat height = CGImageGetHeight(imgRef);

    CGRect imgRect = CGRectMake(0, 0, width, height);
    CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

    CGContextRef bmContext = CGBitmapContextCreate(NULL,
                                                   rotatedRect.size.width,
                                                   rotatedRect.size.height,
                                                   8,
                                                   0,
                                                   colorSpace,
                                                   kCGImageAlphaPremultipliedFirst);
    CGContextSetAllowsAntialiasing(bmContext, YES);
    CGContextSetShouldAntialias(bmContext, YES);
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh);
    CGColorSpaceRelease(colorSpace);
    CGContextTranslateCTM( bmContext, 0.5f * rotatedRect.size.width, 0.5f * rotatedRect.size.height ) ;
    CGContextRotateCTM(bmContext, angleInRadians);
    CGContextDrawImage(bmContext, CGRectMake(-imgRect.size.width* 0.5f, -imgRect.size.height * 0.5f,
                                             imgRect.size.width,
                                             imgRect.size.height),
                       imgRef);
    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
    CFRelease(bmContext);
    [(id)rotatedImage autorelease];

    return rotatedImage;
}
Run Code Online (Sandbox Code Playgroud)

  • 回答你自己的问题不要感到难过.如果能够提供准确,相关的问题答案,请随意接受并接受答案.见[这个wiki帖子](http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question) (3认同)