关于UIImage方向的坑--imageOrientation

最近几天项目用到了关于照片选择和照相机获取图片,出现了一个关于方向的bug,就是在本地展示的时候是正常方向展示的图片,但是上传后却发现照片向右旋转了90度,然后上网各种查资料,终于找到了一个大概的解决方案.

UIImage有一个imageOrientation的属性,主要作用是控制image的绘制方向,共有以下8中方向:

    //UIImageOrientation的定义,定义了如下几种变换  
    typedef enum   
    {  
        UIImageOrientationUp,            // default orientation  

        UIImageOrientationDown,          // 180 deg rotation  

        UIImageOrientationLeft,          // 90 deg CCW  

        UIImageOrientationRight,         // 90 deg CW  

        UIImageOrientationUpMirrored,    // as above but image mirrored along other axis. horizontal flip  

        UIImageOrientationDownMirrored,  // horizontal flip  

        UIImageOrientationLeftMirrored,  // vertical flip  

        UIImageOrientationRightMirrored, // vertical flip  

    } UIImageOrientation;  
  • (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);

该方面使用一个CGImageRef创建UIImage,在创建时还可以指定方法倍数以及旋转方向。当scale设置为1的时候,新创建的图像将和原图像尺寸一摸一样,而orientaion则可以指定新的图像的绘制方向。

下面是个解决应用图片旋转或颠倒的bug:

    + (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;  
    }  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值