UIImagePickerController拍照上传图片旋转问题

转载地址:http://www.cnblogs.com/yajunLi/p/5796084.html


问题描述:

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

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

 

原因分析:

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

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

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

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

解决方法:

Swift版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/**
      照片竖拍  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版:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
- (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
2
3
4
5
6
7
8
9
10
11
12
//若是图片
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



你可能感兴趣的:(iOS开发)