iPhone上关于相机拍照的图片的imageOrientation的问题
来源:互联网 发布:数据魔方关键词 编辑:程序博客网 时间:2024/05/21 11:18
用相机拍摄出来的照片含有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;}
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的imageOrientation的问题
- iPhone相机拍照的图片的imageOrientation的问题
- iPhone上关于相机拍照的图片的旋转问题
- iPhone上关于相机拍照的图片反转90度的问题
- 关于安卓相机拍照的一些问题
- 解决上传iphone拍照的图片自动翻转的问题
- 关于UIImage方向的坑--->imageOrientation
- 关于UIImage方向的坑--imageOrientation
- 调用Android相机拍照的问题
- 奇怪的 imageOrientation
- struts2拦截器
- Spring学习--面向抽象编程(模拟Spring的简单实现)
- linux下的join命令使用方法
- 插入排序
- Go语言并发之美:解释其中内核、外延
- iPhone上关于相机拍照的图片的imageOrientation的问题
- 某社区新旧版首页改造前后可用性与PET分析
- C语言--C99对int[n][m]的支持
- 关于Win 8 应用商店不能联网的几个解决方案
- hadoop文件输出控制,多路径输出到不同文件
- aix系挂载光驱和iso相关命令
- 典型序列及信源编码的一种理解
- JavaScript:函数的可选参数
- netgen.5.0.0下载地址与Windows下编译方法