iOS开发- 相机(摄像头)获取到的图片自动旋转90度解决办法

http://www.tuicool.com/articles/IfEZre

今天写demo的时候发现, 如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转90度。

刚开始觉得莫名其妙, 不知所措。 后来百度了一下,找到了解决办法。

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;
}
时间: 2024-10-09 08:18:26

iOS开发- 相机(摄像头)获取到的图片自动旋转90度解决办法的相关文章

图片旋转90度解决办法

如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转90度. ps: 查找过程中, 碰到了一种说法: [objc] view plaincopy //get original photo from iOS photos //如果该图片大于2M,会自动旋转90度:否则不旋转 UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage]; 至于是否正确, 还没确定. 先Mar

图片旋转90度解决的方法

假设把通过相机获取到的图片,直接进行操作, 比方裁剪, 缩放, 则会把原图片向又旋转90度. ps: 查找过程中, 碰到了一种说法: [objc] view plaincopy //get original photo from iOS photos //假设该图片大于2M,会自己主动旋转90度:否则不旋转 UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage]; 至于是否正确, 还没确定. 先M

点击一次图片 图片就旋转90度

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=Edge,chrome=1"/> <meta name="viewport" content="width=devic

关于android中调用系统拍照,返回图片是旋转90度..

由于项目的需要,没有自定义拍照功能,仅仅调用了系统的拍照程序..但是出现了一个问题,就是拍照完成显示图片居然是被旋转的图片.... 解决办法: /** * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转 */ int degree = readPictureDegree(f.getAbsolutePath()); BitmapFactory.Options opts=new BitmapFactory.Options();//获取缩略图显示到屏幕上 opts.inSampleSiz

【iOS开发-19】遇到Apple Mach-O Linker Error的情况和解决办法,调整你打开的姿势

(1)情形 关闭xcode文档,然后再打开xcode选择已经之前的项目,CMD+R发现出现不行,提示说Apple Mach-O Linker Error. (2)解决办法 点击上面那个错误,发现有个提示说,SevenSwitch,这是我们之前使用cocoapods导入的第三方类库,给UISwitch做实验的,记得当时导入后说打开文件时需要打开后缀是.xcworkspace的那个文件,而不是我们之前的那个.xcodeproj文件. 猜测,可能是我们打开的文件不对.深入到存储目录中,直接打开那个.x

iphone上传拍照图片时图片会旋转90度,从相册选择就不会,安卓手机也不会,怎么解决?

图片 展示元素用 img 就可以 自动修复 不要用第三方的插件 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> <title>图片上传<

iOS开发UI篇—Quartz2D使用(图片剪切)

iOS开发UI篇-Quartz2D使用(图片剪切) 一.使用Quartz2D完成图片剪切 1.把图片显示在自定义的view中 先把图片绘制到view上.按照原始大小,把图片绘制到一个点上. 代码: 1 - (void)drawRect:(CGRect)rect 2 { 3 UIImage *image2=[UIImage imageNamed:@"me"]; 4 [image2 drawAtPoint:CGPointMake(100, 100)]; 5 } 显示: 2.剪切图片让图片圆

李洪强iOS开发之动态获取UILabel的bounds

李洪强iOS开发之动态获取UILabel的bounds 在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度  CGSize labelBounds = [str sizeWithFont:font constrainedToSize:CGSizeMake(MAXFLOAT, 30)]; 注:如果想得到宽度的话,size的width应该设为MAXFLOAT. 2.获取高度,获取字符串在指定的siz

IOS开发之所有类型的UIKeyboardType图片展示

在使用UITextField的时候,我们经常会有需求来控制打开的键盘的类型,虽然文档里都有相应类型的说明,但都不够直观.现在,把所有的UIKeyboardType来以图片展示下.可以直观的来选择所需的键盘种类. UIKeyboardTypeAlphabet      UIKeyboardTypeASCIICapable UIKeyboardTypeDecimalPad   UIKeyboardTypeDefault UIKeyboardTypeEmailAddress UIKeyboardTyp