博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发,解决上传照片按原图旋转了90度的问题
阅读量:5915 次
发布时间:2019-06-19

本文共 5239 字,大约阅读时间需要 17 分钟。

做项目的时候发现, 如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 可能会把原图片向右旋转90度。 用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息。 如果我们忽略orientation信息,而直接对照片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。 所以,在对照片进行处理之前,先将照片旋转到正确的方向,并且返回的imageOrientaion为0。 ####下面这个方法就是一个UIImage category中的方法,用它可以达到获取正确照片方向的目的。

- (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;   } 复制代码

但有时候我们获取图片时用的是AGImagePickerController,在其从ALAsset转为UIImage的时候可能原图就发生了旋转,因此,这里也给出了一个处理办法:

for (ALAsset * asset in self.assetArray) {                CGImageRef ref = [[asset defaultRepresentation]fullResolutionImage];                UIImage *orgImage = [UIImage imageWithCGImage:[asset.defaultRepresentation fullScreenImage]                                                        scale:[asset.defaultRepresentation scale] orientation:                                     (UIImageOrientation)[asset.defaultRepresentation orientation]];                // 这句解决了问题                orgImage = [UIImage imageWithCGImage:ref scale:1 orientation:orgImage.imageOrientation];//                XMLog(@"原始选完imageOrientation===%ld",orgImage.imageOrientation);                // 让图片的旋转方向向上(即正确的方向)                orgImage = [self fixOrientation: orgImage];                [self.previewImageArray addObject:orgImage];            }                        [delegate imagePickerDidSelectImagearray:self.previewImageArray];复制代码

但如果一开始用以下这种写法从ALAsset转为UIImage,就不会发生旋转的问题:

ALAssetRepresentation *assetRep = [asset defaultRepresentation];                CGImageRef imgRef = [assetRep fullResolutionImage];                UIImage *orgImage = [UIImage imageWithCGImage:imgRef                                                   scale:assetRep.scale                                             orientation:(UIImageOrientation)assetRep.orientation];复制代码

参考资料: , 。

转载于:https://juejin.im/post/5a3a14ef6fb9a0452a3c788b

你可能感兴趣的文章
如何应对大促?看京东核心中间件团队的高可用实践指南
查看>>
C# 7.1、7.2特性追踪
查看>>
苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快
查看>>
Jenkins将致力于提升稳定性、易用性和云原生兼容性
查看>>
从零开始用Python实现k近邻算法(附代码、数据集)
查看>>
Spring注解@Primary的意思
查看>>
行业看点 | 军事专家:量子技术将引起战争基因突变,颠覆未来战争形态
查看>>
Intel和ARM中国市场的芯片之战一触即发
查看>>
青云QingCloud上海1区正式商用:四大升级 连接未来
查看>>
抓住售后服务 抓住新的收入流
查看>>
【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动
查看>>
通过maven-war-plugin插件对war包分环境打包
查看>>
python list排序
查看>>
浅谈mysql主从复制高可用
查看>>
亲们,不用再创建变更了
查看>>
微软Windows主管:WP今年不是我们的重点
查看>>
纯科普篇!安全防盗电子围栏这些事儿
查看>>
百会CRM:大数据和云计算引爆智能化变革
查看>>
智能PDU怎样帮助数据中心节能
查看>>
走向5G时代功在技术之外
查看>>