【https://gist.github.com/1531596】
@interface UIImage (fixOrientation)
- ( UIImage * ) fixOrientation ;
@end
@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 ;}