天天看点

图片旋转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;  

}