在UIImageView中旋转图像

10

UIImageView能否仅旋转图像?我正在寻找相关信息,但只找到了有关旋转UIImageVeiw的信息。

5个回答

16

你可以使用以下代码旋转图片。注意,这里使用的是CGImageRef,您可以通过UIImage获取它

CGImageRef imageRef = [self CGImageRotatedByAngle:[image CGImage] angle:30];

获取旋转后的图像后,您可以设置ImageView的图像为新旋转的图像,方法如下:

UIImage* img = [UIImage imageWithCGImage: imageRef];
myImageView.image = img;

这里有一个方法可以旋转imageRef图片:

- (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,
                          +(rotatedRect.size.width/2),
                          +(rotatedRect.size.height/2));
    CGContextRotateCTM(bmContext, angleInRadians);
    CGContextTranslateCTM(bmContext,
                          -(rotatedRect.size.width/2),
                          -(rotatedRect.size.height/2));
    CGContextDrawImage(bmContext, CGRectMake(0, 0,
                                             rotatedRect.size.width,
                                             rotatedRect.size.height),
                       imgRef);



    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext);
    CFRelease(bmContext);
    [(id)rotatedImage autorelease];

    return rotatedImage;
}

谢谢。这正是我想要的。 - gcalikpl
1
最近我遇到了一些意想不到的结果,最终图像失去了原始大小和裁剪角。因此,我稍微修改了函数以获得正确的结果。如果有人想知道我的解决方案在这里:https://dev59.com/enfZa4cB1Zd3GeqPUq1g#19221081 - heximal
旋转后,图像大小将会改变,正如之前的评论者所提到的。上述代码中存在一个小错误。最后一次调用CGContextTranslateCTM和CGContextDrawImage应该使用原始宽度和高度,而不是roundedRect.size.width和rounded.size.height。一旦你这样做了,上述代码就可以完美地工作了。原因是:创建了一个带有旋转矩形的ctxt,将原点移动到中心,然后反向旋转以匹配原始图像方向。此时,您需要将其移回到原始图像的坐标系中。 - matangs

6

看一下如何旋转ImageView的层。您需要导入QuartzCore库才能使其可访问。

myImageView.layer.transform = CGAffineTransformMakeRotation (1.5);

1
必须使用 setAffineTransform - fabian789

5
请尝试这个,我用过了,可行:
[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
[UIView setAnimationRepeatCount:10];
myImgView.transform = CGAffineTransformMakeRotation(M_PI);
[UIView commitAnimations];

祝你好运!


常见的解决方案,但是你旋转的是ImageView而不是图像本身,这才是最初的问题。 - Umair

3
以下代码在Swift中可以正常工作:
let img = UIImage(CGImage: self.imageView.image!.CGImage, scale: 1.0, orientation: UIImageOrientation.Right)
self.imageView.image = img
self.imageView.setNeedsLayout()

0
如果您需要旋转/翻转图像以进行本地化,请使用以下代码: imageView.image = imageView.image?.imageFlippedForRightToLeftLayoutDirection()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接