iOS照片上傳翻轉(zhuǎn)90度的解決方法

今天遇到個(gè)問題,通過iphone照相上傳的照片,后臺(tái)人員拿到是橫著的。還有,后臺(tái)同事說上傳的圖片是png的,但是實(shí)際上其實(shí)是jpg的,只是后綴名包了一層png。具體為什么,還有待我查查。先說翻轉(zhuǎn)問題,查了一下,解決方法有很多,下面就說一個(gè)給大家。
先說下原因:看論壇中的兄弟說,用相機(jī)拍攝出來的照片含有EXIF信息,UIImage的imageOrientation屬性指的就是EXIF中的orientation信息。
如果我們忽略orientation信息,而直接對(duì)照片進(jìn)行像素處理或者drawInRect等操作,得到的結(jié)果是翻轉(zhuǎn)或者旋轉(zhuǎn)90之后的樣子。這是因?yàn)槲覀儓?zhí)行像素處理或者drawInRect等操作之后,imageOrientaion信息被刪除了,imageOrientaion被重設(shè)為0,造成照片內(nèi)容和imageOrientaion不匹配。
所以,在對(duì)照片進(jìn)行處理之前,先將照片旋轉(zhuǎn)到正確的方向,并且返回的imageOrientaion為0。

下面是代碼實(shí)現(xiàn):

  • (UIImage *)fixOrientation:(UIImage *)aImage {
    if (aImage.imageOrientation == UIImageOrientationUp)
    return aImage;

    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;
    

    }

    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;
    

    }

    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
    UIImage *img = [UIImage imageWithCGImage:cgimg];
    CGContextRelease(ctx);
    CGImageRelease(cgimg);
    return img;
    }

大家粘過去就可以直接用了。
不過有個(gè)問題就是
我是使用的UIImagePickerControllerEditedImage 而非
UIImagePickerControllerOriginalImage 等其他模式,具體原因?yàn)槭裁?,我還真就不知道。
希望對(duì)大家有用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容