iOS:图片的旋转方向问题

转载 2015年03月10日 12:41:50

【你知道吗?】iOS 6 默认相机程序让你的 iPhone 照片自带方向信息

可能几乎很少的人会知道在 iOS 6中有一项新的功能是用 iPhone 拍出的照片会记录该照片的方向信息。

在 iPhone 3G 开始的地理信息标记功能后,现在当你使用 iPhone 原生的摄像功能的时候,拍摄出来的照片的 metadate 中会包含有你拍摄照片的那一刻手机摄像头方向的信息。

在 iOS 6之前,想要在照片中包含方向信息,用户需要使用到一个昂贵的配件来配合数码相机使用,例如 Solmeta Geotagger N3。

据了解,这样的方向信息只会在你使用默认的拍照应用的时候才会被记录下来。如果你使用的是其它第三方摄像应用,那么拍摄出来的照片是不会包含方向信息的。如果你编辑该图片,这样的方向信息也有可能会丢失,这些都取决于图像编辑应用。

现在我也不确定这个功能是不是在所有的 iPhone 上都有,不过 iPhone 5/4S/4 都被验证,所拍图像有方向信息。

(以上文章出自:http://www.tuicool.com/articles/6Rnmey)

上面的情况就导致在开发中会有一些问题:UIImagePickerController返回的照片带有方向信息,如果直接上传到服务器的话,可能造成旋转了90°(当手机竖直拍照)的情况。而且如果直接取其jpeg数据,或者将UIImage保存到本地的话,就会丢失这个方向信息,导致下一次读取出来图片就是颠倒的。为了让上传到服务器或者保存的本地的图片和照相时候一样,需要利用UIImage的imageOrientation将其矫正。

UIImage 有个只读属性imageOrientation 来标识它的方向。

    UIImageOrientation myOrientation = myImage.imageOrientation;

//    typedef enum {  

//        UIImageOrientationUp,            // default orientation  默认方向  

//        UIImageOrientationDown,          // 180 deg rotation    旋转180  

//        UIImageOrientationLeft,          // 90 deg CCW         逆时针旋转90  

//        UIImageOrientationRight,         // 90 deg CW          顺时针旋转90  

//        UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip   向上水平翻转  

//        UIImageOrientationDownMirrored,  // horizontal flip    向下水平翻转  

//        UIImageOrientationLeftMirrored,  // vertical flip      逆时针旋转90度,垂直翻转  

//        UIImageOrientationRightMirrored, // vertical flip      顺时针旋转90度,垂直翻转  

//    } UIImageOrientation;  


另提供图像纠正的部分代码如下供大家参考:

[objc] view plaincopy在CODE上查看代码片派生到我的代码片
  1. - (UIImage *)fixOrientation:(UIImage *)srcImg {  
  2.     if (srcImg.imageOrientation == UIImageOrientationUp) return srcImg;  
  3.     CGAffineTransform transform = CGAffineTransformIdentity;  
  4.     switch (srcImg.imageOrientation) {  
  5.         case UIImageOrientationDown:  
  6.         case UIImageOrientationDownMirrored:  
  7.             transform = CGAffineTransformTranslate(transform, srcImg.size.width, srcImg.size.height);  
  8.             transform = CGAffineTransformRotate(transform, M_PI);  
  9.             break;  
  10.               
  11.         case UIImageOrientationLeft:  
  12.         case UIImageOrientationLeftMirrored:  
  13.             transform = CGAffineTransformTranslate(transform, srcImg.size.width0);  
  14.             transform = CGAffineTransformRotate(transform, M_PI_2);  
  15.             break;  
  16.               
  17.         case UIImageOrientationRight:  
  18.         case UIImageOrientationRightMirrored:  
  19.             transform = CGAffineTransformTranslate(transform, 0, srcImg.size.height);  
  20.             transform = CGAffineTransformRotate(transform, -M_PI_2);  
  21.             break;  
  22.         case UIImageOrientationUp:  
  23.         case UIImageOrientationUpMirrored:  
  24.             break;  
  25.     }  
  26.       
  27.     switch (srcImg.imageOrientation) {  
  28.         case UIImageOrientationUpMirrored:  
  29.         case UIImageOrientationDownMirrored:  
  30.             transform = CGAffineTransformTranslate(transform, srcImg.size.width0);  
  31.             transform = CGAffineTransformScale(transform, -11);  
  32.             break;  
  33.               
  34.         case UIImageOrientationLeftMirrored:  
  35.         case UIImageOrientationRightMirrored:  
  36.             transform = CGAffineTransformTranslate(transform, srcImg.size.height0);  
  37.             transform = CGAffineTransformScale(transform, -11);  
  38.             break;  
  39.         case UIImageOrientationUp:  
  40.         case UIImageOrientationDown:  
  41.         case UIImageOrientationLeft:  
  42.         case UIImageOrientationRight:  
  43.             break;  
  44.     }  
  45.       
  46.     CGContextRef ctx = CGBitmapContextCreate(NULL, srcImg.size.width, srcImg.size.height,  
  47.                                              CGImageGetBitsPerComponent(srcImg.CGImage), 0,  
  48.                                              CGImageGetColorSpace(srcImg.CGImage),  
  49.                                              CGImageGetBitmapInfo(srcImg.CGImage));  
  50.     CGContextConcatCTM(ctx, transform);  
  51.     switch (srcImg.imageOrientation) {  
  52.         case UIImageOrientationLeft:  
  53.         case UIImageOrientationLeftMirrored:  
  54.         case UIImageOrientationRight:  
  55.         case UIImageOrientationRightMirrored:  
  56.             CGContextDrawImage(ctx, CGRectMake(0,0,srcImg.size.height,srcImg.size.width), srcImg.CGImage);  
  57.             break;  
  58.               
  59.         default:  
  60.             CGContextDrawImage(ctx, CGRectMake(0,0,srcImg.size.width,srcImg.size.height), srcImg.CGImage);  
  61.             break;  
  62.     }  
  63.       
  64.     CGImageRef cgimg = CGBitmapContextCreateImage(ctx);  
  65.     UIImage *img = [UIImage imageWithCGImage:cgimg];  
  66.     CGContextRelease(ctx);  
  67.     CGImageRelease(cgimg);  
  68.     return img;  
  69. }  
  70. 转载自:http://blog.csdn.net/demoker/article/details/21806291?utm_source=tuicool

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

对图片本身进行旋转 + (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation { long do...
  • cjh965063777
  • cjh965063777
  • 2015年10月13日 11:37
  • 3164

IOS 以任意点为圆心 旋转UIView

围绕底边中点旋转                            UIView本身是支持旋转的,可以用UIView.transform属性实现旋转。 The origin of th...
  • holdsky
  • holdsky
  • 2014年11月01日 17:04
  • 5005

iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度

1.让图片旋转 UIImageView *imageView = [[UIImageView alloc]init]; imageView.frame = CGRectMake(50, 50,...
  • fengchenlangzi_
  • fengchenlangzi_
  • 2016年10月25日 23:19
  • 6573

如何处理iOS中照片的方向

http://feihu.me/blog/2015/how-to-handle-image-orientation-on-iOS/
  • winsdom123456
  • winsdom123456
  • 2015年06月05日 09:43
  • 1811

iOS 旋转手势

iOS的手势功能很强大,大家都知道。但是如何使用了? 这里 我们简单的以一个UILabel测试一下旋转 使用Xcode 创建一个工程 起名testRotation 我们在默认生...
  • lwjok2007
  • lwjok2007
  • 2016年03月09日 15:53
  • 684

iOS7、iOS8中的CGAffineTransformRotate、view的旋转方向问题

主题 : iOS7、iOS8中的CGAffineTransformRotate、view的旋转问题 [UIView animateWithDuration:4 animations:...
  • beebeebaabaa
  • beebeebaabaa
  • 2015年03月11日 18:29
  • 2347

iOS 图片左右反转 反向

http://blog.csdn.net/xyxjn/article/details/37902609 方法1 _imageView.transform = CGAffineTra...
  • jeffasd
  • jeffasd
  • 2016年03月22日 13:33
  • 1732

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

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

iOS图片绕定点旋转

iOS图片绕定点旋转方法
  • chenjin360
  • chenjin360
  • 2014年05月27日 08:53
  • 2585

iOS拍照之后图片自动旋转90度解决办法

iOS 拍照照片旋转
  • zhoupengju
  • zhoupengju
  • 2016年04月14日 21:03
  • 9069
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS:图片的旋转方向问题
举报原因:
原因补充:

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