@interface UIImage (fixOrientation) | |
- (UIImage *)fixOrientation; | |
@end |
@implementation UIImage (fixOrientation) | |
- (UIImage *)fixOrientation { | |
// No-op if the orientation is already correct | |
if (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 context | |
CGImageRef cgimg = CGBitmapContextCreateImage(ctx); | |
UIImage *img = [UIImage imageWithCGImage:cgimg]; | |
CGContextRelease(ctx); | |
CGImageRelease(cgimg); | |
return img; | |
} | |
@end |
@interface UIImage (fixOrientation) | |
- (UIImage *)fixOrientation; | |
@end |
@implementation UIImage (fixOrientation) | |
- (UIImage *)fixOrientation { | |
// No-op if the orientation is already correct | |
if (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 context | |
CGImageRef cgimg = CGBitmapContextCreateImage(ctx); | |
UIImage *img = [UIImage imageWithCGImage:cgimg]; | |
CGContextRelease(ctx); | |
CGImageRelease(cgimg); | |
return img; | |
} | |
@end |
This comment has been minimized.
This comment has been minimized.
Agree with @aelam , High-resolution photos cause a pretty serious memory problem. |
This comment has been minimized.
This comment has been minimized.
i won't use this class until it get fixed. It crashed my app all the time |
This comment has been minimized.
This comment has been minimized.
Hi, same memory problem here (a huge memory peak). |
This comment has been minimized.
This comment has been minimized.
like this
|
This comment has been minimized.
This comment has been minimized.
Is it available via CocoaPods? |
This comment has been minimized.
This comment has been minimized.
|
This comment has been minimized.
there is a problem ,
if if the photo is a High-resolution one taken by iPhone 4S,After fixed Orientation
there will be two High-resolution images in memory, it takes too much memory.
Is there any other way to do this ?