【问题标题】:Rotate image in UIImageView在 UIImageView 中旋转图像
【发布时间】:2011-08-25 13:46:29
【问题描述】:

是否可以只旋转 UIImageView 中的图像?我正在寻找有关它的信息,但我只找到了如何旋转 UIImageVeiw 的信息。

【问题讨论】:

    标签: iphone objective-c ios uiimageview uiimage


    【解决方案1】:

    您可以使用以下代码旋转图像。请注意,这使用了一个 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;
    }
    

    【讨论】:

    • 谢谢。这正是我想要的。
    • 有人可能会像我最近所做的那样面临不可预知的结果——最终的图像失去了原来的大小并裁剪了角落。所以我稍微修改了函数以获得正确的结果。如果有人想知道我的解决方案在这里:stackoverflow.com/questions/19219855/…
    • 旋转后图像大小将如先前评论者所述发生变化。上面的代码中有一个小错误。最后一次调用 CGContextTranslateCTM 和 CGContextDrawImage 应该使用原始宽度和高度,而不是 roundedRect.size.width 和 rounded.size.height。一旦你这样做了,上面的代码就完美地工作了。原因 - 创建一个带有旋转矩形的 ctxt,原点移动到中心,然后反向旋转以匹配原始图像方向。此时您需要将其移回原始图像的坐标系中。
    【解决方案2】:

    看看旋转 ImageView 的图层。您将需要导入 QuartzCore 库以使其可访问。

    myImageView.layer.transform = CGAffineTransformMakeRotation (1.5);
    

    【讨论】:

    • 必须使用setAffineTransform
    【解决方案3】:

    请试试这个,它对我有用:

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    [UIView setAnimationRepeatCount:10];
    myImgView.transform = CGAffineTransformMakeRotation(M_PI);
    [UIView commitAnimations];
    

    祝你好运!

    【讨论】:

    • 常见的解决方案,但您正在旋转 ImageView 而不是 Image 本身,这是原始问题。
    【解决方案4】:

    以下代码可以在 Swift 中正常工作:

    let img = UIImage(CGImage: self.imageView.image!.CGImage, scale: 1.0, orientation: UIImageOrientation.Right)
    self.imageView.image = img
    self.imageView.setNeedsLayout()
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多