iOS:图片的旋转方向问题

【你知道吗?】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拍照上传图片被旋转

2016年11月21日 78KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭