天天看點

圖檔旋轉90度解決辦法

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

}