• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

问题描述:

手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在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人参与评论

请发表评论

全部评论

专题导读
上一篇:
Swift项目兼容Objective-C问题汇总发布时间:2022-07-13
下一篇:
OC与Swift的主要区别发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap