美文网首页
iOS照相机获取到的图片自动旋转90度解决办法

iOS照相机获取到的图片自动旋转90度解决办法

作者: 彗星来的那一夜 | 来源:发表于2018-04-24 17:12 被阅读32次

    情景再现:
    iOS开发过程中,要实现用用手机摄像头拍一张照片,经过裁剪压缩,然后发出去。结果发出去的图片始终是逆时针旋转了90度的图片。

    事出有因:
    相机拍照后直接取出来的UIimage(用UIImagePickerControllerOriginalImage取出),它本身的imageOrientation属性是3,即UIImageOrientationRight。如果这个图片直接使用则没事,但是如果对它进行裁剪、缩放等操作后,它的这个imageOrientation属性会变成0。此时这张图片用在别的地方就会发生旋转。imageOrientation是只读的,不能直接修改其值。

    解决办法:

    1. 设置相机的一个属性allowsEditing为YES,设了这个值,你拍完照片后会在照片上出现一个框框,这就是对照片的裁剪编辑。在相机的代理方法中取照片的时候就别用UIImagePickerControllerOriginalImage来取了,要用UIImagePickerControllerEditedImage。用这个key取出来的照片,它的imageOrientation是0,所以之后的任何裁剪、缩放操作都不会造成旋转。这是第一种方法。

    2.有时候你的需求是要照相结果的原图。那么,就要对图片进行手动旋转。这里有一个专门针对这个事的很好的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;  
    }  
    

    这个分类是根据图片的imageOrientation属性,对它进行旋转。这个方法比较费内存。

    相关文章

      网友评论

          本文标题:iOS照相机获取到的图片自动旋转90度解决办法

          本文链接:https://www.haomeiwen.com/subject/anijlftx.html