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 如何让button内的image旋转

// // JCAllBuyViewController.m // 09-彩票-空工程 // // Created by panba on 16-6-2. // Copyright (c) 2...

如何处理iOS中照片的方向

用手机拍摄的照片发送到PC媏后方向改变了?想必开发过跨平台IM程序的人都经历过吧。使用过iPhone或者iPad的朋友在拍照时不知是否遇到过这样的问题,将设备中的照片导出到Windows上时,经常发现...

iOS开发笔记--CGAffineTransformMakeRotation 实现旋转

实现一张图片的旋转部分角度显示 UIImageView *image = [[UIImageView alloc]init]; image.frame = CGRectMake(50, ...
  • hopedark
  • hopedark
  • 2014年01月29日 10:01
  • 20014

IOS利用CGAffineTransform实现图片旋转

实现一张图片的旋转部分角度显示 [objc] view plaincopy UIImageView *image = [[UIImageView alloc]init]; ...

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

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

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

对图片本身进行旋转 + (UIImage *)image:(UIImage *)image rotation:(UIImageOrientation)orientation { long do...

【iOS】关于视图的旋转和复原(CGAffineTransform)

我就以我自己的简单的旋转来抛砖引玉了。 首先,你创建一个view,然后实现view 的旋转动画和复原 旋转的的代码: [UIView animateWithDuration:2.0f animat...
  • wm9028
  • wm9028
  • 2015年11月23日 13:44
  • 5958

利用exif.js解决ios手机上传竖拍照片旋转90度问题

html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题;Android手机没这个问题。 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非...
  • linlzk
  • linlzk
  • 2015年09月22日 12:46
  • 36899

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

from: http://blog.csdn.net/cjh965063777/article/details/49096383 对图片本身进行旋转 [objc] view ...

web前端图片极限优化策略

随着web的发展,网站资源的流量也变得越来越大。据统计,60%的网站流量均来自网站图片,可见对图片合理优化可以大幅影响网站流量,减小带宽消耗和服务器压力。 一、现有web图片格式 我们先来看下现在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS:图片的旋转方向问题
举报原因:
原因补充:

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