ios - UIImageView:获取转换后的 UIImage

标签 ios uiimageview core-graphics transform

我正在使用这个旋转 UIImageView:

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

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

enter image description here

最佳答案

好的,我又来回答我自己的问题了,希望它对以后的人有用...... 回到 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;
}

关于ios - UIImageView:获取转换后的 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19219855/

相关文章:

ios - 无法创建展开转场

ios - Stripe API 给出 ​​ 'SenTestingKit/SenTestingKit.h' 找不到文件

ios - 我怎样才能看到 UIImageView 中的图像?

swift - 更改单元格高度但不更改其中的元素

objective-c - 如何比较两个 CGSize 变量?

ios - 核心数据 NSPredicate for (select ... where not in (select))

ios - 错误 : in auto-import: failed to get module from AST context:

ios - 触摸时黑色叠加层消失在 UIImageView 背景上

objective-c - UIView中的触摸事件

swift - 两个半透明矩形重叠而不改变公共(public)区域颜色