iOS拍照上传后,在web端显示旋转 Swift+OC版解决方案

问题描述:

手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题。

并且照片竖怕才会有此问题,横拍不存在。

 

原因分析:

手机拍照时,用相机拍摄出来的照片是含有EXIF信息的,在我们得到 UIImage时,可以查看此Image的imageOrientation属性,其实就是指的EXIF中的orientation信息。

如果我们忽略orientation信息,而直接对照片进行像素处理或上传等操作,得到的结果是翻转或者旋转90之后的样子。

这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。

所以,在对照片进行处理之前,先将照片旋转到正确的方向,保证返回的imageOrientaion为0。

解决方法:

Swift版:

/**
     照片竖拍  web显示旋转解决:图片大于2M会自动旋转90度
     
     - parameter aImage: <#aImage description#>
     
     - returns: <#return value description#>
     */
    class func fixOrientation(aImage:UIImage)->UIImage  {
        if aImage.imageOrientation == UIImageOrientation.Up{
            return aImage
        }
    
        var transform = CGAffineTransformIdentity
        
        switch (aImage.imageOrientation) {
        case .Down,.DownMirrored:
        transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height)
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI))
        break;
        
        case .Left,.LeftMirrored:
        transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)
        transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))
        break;
        
        case .Right,.RightMirrored:
        transform = CGAffineTransformTranslate(transform, 0, aImage.size.height)
        transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))
        break;
        default:
        break;
        }
        
        switch (aImage.imageOrientation) {
        case .UpMirrored,.DownMirrored:
        transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)
        transform = CGAffineTransformScale(transform, -1, 1)
        break;
        
        case .LeftMirrored,.RightMirrored:
        transform = CGAffineTransformTranslate(transform, aImage.size.height, 0)
        transform = CGAffineTransformScale(transform, -1, 1)
        break;
        default:
        break;
        }
        
        let ctx:CGContextRef = CGBitmapContextCreate(nil, Int(aImage.size.width), Int(aImage.size.height),
        CGImageGetBitsPerComponent(aImage.CGImage), 0,
        CGImageGetColorSpace(aImage.CGImage),
        1)!


        
        CGContextConcatCTM(ctx, transform)
        switch (aImage.imageOrientation) {
        case .Left,.LeftMirrored,.Right,.RightMirrored:
        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;
        }
        
        let cgimg:CGImageRef = CGBitmapContextCreateImage(ctx)!
        let img:UIImage = UIImage(CGImage: cgimg)
        return img;
        }

  

OC版:

- (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;  
} 

  

 

亲测,在完成拍照代理里,获取到图片后,用此方法处理后,再上传服务器,可解决该问题。

            //若是图片
            var img:UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            //保存相册
            UIImageWriteToSavedPhotosAlbum(img, self, nil, nil)
            
            img = PublicMethod.fixOrientation(img)
            
            //压缩图片
            let imgData:NSData = UIImageJPEGRepresentation(img, 0.2)!
            //上传服务器
            self.uploadHeadImg(imgData, headImage: img)
    

  

参考文献:http://blog.csdn.net/hitwhylz/article/details/39518463

如果有疑问,欢迎留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值