别忽视UIImage中的方向属性, imageOrientation

转载 2012年09月14日 11:38:15

这几天写个拍照,或者从相册中选择照片,进行剪切,然后分享.结果出现了,剪切后图片颠倒或者旋转90度的问题.

找了很久才发现是忽略imageOrientation这个属性.

以下为解决方法:

+ (UIImage *)fixOrientation:(UIImage *)aImage {
    
    // No-op if the orientation is already correct
    if (aImage.imageOrientation == UIImageOrientationUp) 
        return aImage;
    
    // We need to calculate the proper transformation to make the image upright.
    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
    CGAffineTransform transform = CGAffineTransformIdentity;
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationDown:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
            transform = CGAffineTransformRotate(transform, M_PI);
            break;
            
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformRotate(transform, M_PI_2);
            break;
            
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
            transform = CGAffineTransformRotate(transform, -M_PI_2);
            break;
        default:
            break;
    }
    
    switch (aImage.imageOrientation) {
        case UIImageOrientationUpMirrored:
        case UIImageOrientationDownMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
            
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRightMirrored:
            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
            transform = CGAffineTransformScale(transform, -1, 1);
            break;
        default:
            break;
    }
    
    // Now we draw the underlying CGImage into a new context, applying the transform
    // calculated above.
    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
                                             CGImageGetBitsPerComponent(aImage.CGImage), 0,
                                             CGImageGetColorSpace(aImage.CGImage),
                                             CGImageGetBitmapInfo(aImage.CGImage));
    CGContextConcatCTM(ctx, transform);
    switch (aImage.imageOrientation) {
        case UIImageOrientationLeft:
        case UIImageOrientationLeftMirrored:
        case UIImageOrientationRight:
        case UIImageOrientationRightMirrored:
            // Grr...
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
            break;
            
        default:
            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
            break;
    }
    
    // And now we just create a new UIImage from the drawing context
    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
}

参考:http://www.cnblogs.com/jiangyazhou/archive/2012/03/22/2412343.html


如果用用UIGraphicsBeginImageContext 去重新绘制也可以解决,但是处理速度实在太慢.

UIImage的imageOrientation属性 修改图片旋转了的bug

本回要从我们项目说起,今天测试的给我叫去,问我这个图片裁剪是不是有BUG,从手机相册里选的图(iOS设备)裁剪出来怎么就.....(省略好多字)。 当时本大侠就想 NND当时我做的时候就用模...
  • u013430014
  • u013430014
  • 2015年05月28日 15:23
  • 2922

UIImage改变图片方向

+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientati...
  • qq_25737881
  • qq_25737881
  • 2016年09月20日 00:50
  • 647

IOS:聊一聊UIImage几点知识

UIImage是IOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有CGImage,以及IOS5.0以后新增加的CIImage。今天我们主要聊一聊UIImage的三个属性: imageO...
  • App_IOS
  • App_IOS
  • 2016年11月01日 13:31
  • 252

别忽视UIImage中的方向属性, imageOrientation

这几天写个拍照,或者从相册中选择照片,进行剪切,然后分享.结果出现了,剪切后图片颠倒或者旋转90度的问题. 找了很久才发现是忽略imageOrientation这个属性. 以下为解决方法: ...
  • Liar0606
  • Liar0606
  • 2015年01月24日 09:12
  • 1872

iOS开发中关于UIImage的知识点总结

本文是转载文章
  • Ordinary_Rookie
  • Ordinary_Rookie
  • 2016年04月07日 14:28
  • 382

UIImage旋转详解

本文讲解UIImage的旋转方法,是UIImage,不是UIImageView!!! 主要用途:手机横屏拍照,需要得到一张width大于height的照片。或者其他用途 说实在话,图片旋转的逻...
  • gang544043963
  • gang544043963
  • 2015年11月12日 17:06
  • 3108

UIImage图片处理,旋转、截取、平铺、缩放等操作

有时候我们需要处理图片,比如改变大小,旋转,截取等等,所以今天说一说图片处理相关的一些操作。 本文所说的方法都是写在UIImage的Category中,这样使用起来也方便;由于代码太...
  • qq_34047841
  • qq_34047841
  • 2016年09月07日 15:57
  • 396

UIImage图片处理,旋转、截取、平铺、缩放等操作

颜色相关1.根据颜色生成纯色图片 就是根据制定的颜色生成一张纯色的图片+ (UIImage *)imageWithColor:(UIColor *)color;使用方法,比如设置UIImageVie...
  • Zhi_Sheng
  • Zhi_Sheng
  • 2016年09月20日 14:54
  • 333

iOS开发 UIimage旋转,得到旋转后的Image图片,解决imageView旋转,内部图片不跟着旋转问题

一:前言  1.0  : 图片处理中,比如对一个ImageView进行旋转,那么旋转后图片缺还是原来的样子,本文就是解决图片旋转的问题  1.0 :无demo说话不硬气,上github地址:htt...
  • horisea
  • horisea
  • 2017年04月21日 15:21
  • 1928

iOS 对Image图片本身进行旋转0,90,180,270

对图片本身进行旋转 + (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation { long do...
  • cjh965063777
  • cjh965063777
  • 2015年10月13日 11:37
  • 3083
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:别忽视UIImage中的方向属性, imageOrientation
举报原因:
原因补充:

(最多只允许输入30个字)