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 plain copy 在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值