相机(摄像头)获取到的图片自动旋转90度解决办法
2016-01-22 10:51
507 查看
今天写demo的时候发现, 如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转90度。
刚开始觉得莫名其妙, 不知所措。 后来百度了一下,找到了解决办法。
ps: 查找过程中, 碰到了一种说法:
至于是否正确, 还没确定。 先Mark。
下面的解决办法亲测可行。 原文:http://www.cnblogs.com/jiangyazhou/archive/2012/03/22/2412343.html
用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的orientation信息。
如果我们忽略orientation信息,而直接对照片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。
所以,在对照片进行处理之前,先将照片旋转到正确的方向,并且返回的imageOrientaion为0。
下面这个方法就是一个UIImage category中的方法,用它可以达到以上目的。
刚开始觉得莫名其妙, 不知所措。 后来百度了一下,找到了解决办法。
ps: 查找过程中, 碰到了一种说法:
//get original photo from iOS photos //如果该图片大于2M,会自动旋转90度;否则不旋转 UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage];
至于是否正确, 还没确定。 先Mark。
下面的解决办法亲测可行。 原文:http://www.cnblogs.com/jiangyazhou/archive/2012/03/22/2412343.html
用相机拍摄出来的照片含有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; }
相关文章推荐
- C#实现控制摄像头的类
- 使用ImageMagick进行图片缩放、合成与裁剪(js+python)
- Android 开发随手笔记之使用摄像头拍照
- Android开发从相机或相册获取图片裁剪
- C#实现调用本机摄像头实例
- PHP图像裁剪缩略裁切类源码及使用方法
- PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
- jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
- ASP固定比例裁剪缩略图的方法
- PHP实现图片不变型裁剪及图片按比例裁剪的方法
- 解决Android从相册中获取图片出错图片却无法裁剪问题的方法
- Android拍照裁剪图片
- ASP.NET简单好用功能齐全图片上传工具类(水印、缩略图、裁剪等)
- 基于JQuery实现的图片自动进行缩放和裁剪处理
- unity3d调用手机或电脑摄像头
- MacOS 安装 PHP的图片裁剪扩展Tclip
- Python中使用摄像头实现简单的延时摄影技术
- android 实现圆形imageView,Circle imageView.
- Linux系统中如何正确安装摄像头驱动
- 深入挖掘手机摄像头的潜力