今天遇到UIImagePickerController控件竖屏拍照保存后图片自动向右旋转了90度 ,而在相册中选取的图片保存后就不会出现这样的状况。
UIImage有一个属性imageOrientation,只读属性,记录你的image拍摄时的orientation。
解决方法如下:
@interface UIImage (fixOrientation)- ( UIImage * ) fixOrientation ;@end
@implementation UIImage (fixOrientation)- ( UIImage * ) fixOrientation {// No-op if the orientation is already correctif ( self . imageOrientation == UIImageOrientationUp ) return self ;// 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 ( self . imageOrientation ) {case UIImageOrientationDown :case UIImageOrientationDownMirrored :transform = CGAffineTransformTranslate ( transform , self . size . width , self . size . height );transform = CGAffineTransformRotate ( transform , M_PI );break ;case UIImageOrientationLeft :case UIImageOrientationLeftMirrored :transform = CGAffineTransformTranslate ( transform , self . size . width , 0 );transform = CGAffineTransformRotate ( transform , M_PI_2 );break ;case UIImageOrientationRight :case UIImageOrientationRightMirrored :transform = CGAffineTransformTranslate ( transform , 0 , self . size . height );transform = CGAffineTransformRotate ( transform , - M_PI_2 );break ;}switch ( self . imageOrientation ) {case UIImageOrientationUpMirrored :case UIImageOrientationDownMirrored :transform = CGAffineTransformTranslate ( transform , self . size . width , 0 );transform = CGAffineTransformScale ( transform , - 1 , 1 );break ;case UIImageOrientationLeftMirrored :case UIImageOrientationRightMirrored :transform = CGAffineTransformTranslate ( transform , self . size . height , 0 );transform = CGAffineTransformScale ( transform , - 1 , 1 );break ;}// Now we draw the underlying CGImage into a new context, applying the transform// calculated above.CGContextRef ctx = CGBitmapContextCreate ( NULL , self . size . width , self . size . height ,CGImageGetBitsPerComponent ( self . CGImage ), 0 ,CGImageGetColorSpace ( self . CGImage ),CGImageGetBitmapInfo ( self . CGImage ));CGContextConcatCTM ( ctx , transform );switch ( self . imageOrientation ) {case UIImageOrientationLeft :case UIImageOrientationLeftMirrored :case UIImageOrientationRight :case UIImageOrientationRightMirrored :// Grr...CGContextDrawImage ( ctx , CGRectMake ( 0 , 0 , self . size . height , self . size . width ), self . CGImage );break ;default :CGContextDrawImage ( ctx , CGRectMake ( 0 , 0 , self . size . width , self . size . height ), self . CGImage );break ;}// And now we just create a new UIImage from the drawing contextCGImageRef cgimg = CGBitmapContextCreateImage ( ctx );UIImage * img = [ UIImage imageWithCGImage : cgimg ];CGContextRelease ( ctx );CGImageRelease ( cgimg );return img ;}@end