美文网首页iOS开发攻城狮的集散地
iOS-处理相机拍照&相册选择图片的方向矫正

iOS-处理相机拍照&相册选择图片的方向矫正

作者: 蒋大为 | 来源:发表于2018-12-28 16:45 被阅读17次

    问题

    如果把通过相机获取到的图片,直接进行操作,比如裁剪、缩放等原图片都会旋转。

    产生原因

    1、如果该图片大于2M,会自动旋转;否则不旋转。

    UIImage *originalImg = [dict objectForKey:UIImagePickerControllerOriginalImage];

    2、用相机拍摄出来的照片含有EXIF信息,UIImage的imageOrientation属性指的就是EXIF中的Orientaion信息。
    如果我们忽略Orientaion信息,而直接对照片进行像素处理或者drawInRect等操作,得到的结果是翻转或者旋转90之后的样子。
    这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。

    解决办法

    在UIImage Category中写一个处理图片方向的方法,然后在相机拍照获取到图片后调用,就可以解决原始图片旋转的问题了,下面是UIImage类别的方法源码,可直接复制调用哦~~~

    + (UIImage *)fixOrientation:(UIImage *)image {
        if (image.imageOrientation == UIImageOrientationUp)
            return image;
        CGAffineTransform transform = CGAffineTransformIdentity;
        
        switch (image.imageOrientation) {
            case UIImageOrientationDown:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
                transform = CGAffineTransformRotate(transform,M_PI);
                break;
                
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.width,0);
                transform = CGAffineTransformRotate(transform,M_PI_2);
                break;
                
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform,0, image.size.height);
                transform = CGAffineTransformRotate(transform, -M_PI_2);
                break;
            default:
                break;
        }
        
        switch (image.imageOrientation) {
            case UIImageOrientationUpMirrored:
            case UIImageOrientationDownMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.width,0);
                transform = CGAffineTransformScale(transform, -1,1);
                break;
                
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRightMirrored:
                transform = CGAffineTransformTranslate(transform, image.size.height,0);
                transform = CGAffineTransformScale(transform, -1,1);
                break;
            default:
                break;
        }
        
        CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
                                                 CGImageGetBitsPerComponent(image.CGImage),0,
                                                 CGImageGetColorSpace(image.CGImage),
                                                 CGImageGetBitmapInfo(image.CGImage));
        CGContextConcatCTM(ctx, transform);
        switch (image.imageOrientation) {
            case UIImageOrientationLeft:
            case UIImageOrientationLeftMirrored:
            case UIImageOrientationRight:
            case UIImageOrientationRightMirrored:
                // Grr...
                CGContextDrawImage(ctx,CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
                break;
                
            default:
                CGContextDrawImage(ctx,CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
                break;
        }
        
        CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
        UIImage *img = [UIImage imageWithCGImage:cgimg];
        CGContextRelease(ctx);
        CGImageRelease(cgimg);
        return img;
    }
    

    相关文章

      网友评论

        本文标题:iOS-处理相机拍照&相册选择图片的方向矫正

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