解决图片上传到服务器旋转90度的问题(图片倒置)

本文提供了一个简单有效的方案来解决上传图片旋转90度的问题,通过判断图片的原始方向并应用相应的转换矩阵,使得图片能够正确旋转并保持正确的方向。此方法适用于多种应用场景,确保了图片在不同展示环境下的正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#pragma mark 解决上传图旋转90度的方案
- (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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值