如果把通过相机获取到的图片,直接进行操作, 比如裁剪, 缩放, 则会把原图片向又旋转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);
case uiimageorientationright:
case uiimageorientationrightmirrored:
transform = cgaffinetransformtranslate(transform, 0, aimage.size.height);
transform = cgaffinetransformrotate(transform, -m_pi_2);
default:
}
case uiimageorientationupmirrored:
transform = cgaffinetransformscale(transform, -1, 1);
transform = cgaffinetransformtranslate(transform, aimage.size.height, 0);
// 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);
// grr...
cgcontextdrawimage(ctx, cgrectmake(0,0,aimage.size.height,aimage.size.width), aimage.cgimage);
cgcontextdrawimage(ctx, cgrectmake(0,0,aimage.size.width,aimage.size.height), aimage.cgimage);
// 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;
}