如果把通過相機擷取到的圖檔,直接進行操作, 比如裁剪, 縮放, 則會把原圖檔向又旋轉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;
}