@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 |
i won't use this class until it get fixed. It crashed my app all the time
Hi, same memory problem here (a huge memory peak).
Anybody knows the way to avoid this peak?
like this
it takes the same memory!
-
(UIImage )imageRotate:(UIImage_)image
{
if ([_image imageOrientation] == UIImageOrientationUp)
{
return *image;
}
CGAffineTransform transform = CGAffineTransformIdentity;switch ([_image imageOrientation])
{
case UIImageOrientationDown:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, (_image).size.width, (*image).size.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, (*image).size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, (*image).size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; default: break;
}
switch ((_image).imageOrientation)
{
case UIImageOrientationUpMirrored:
case UIImageOrientationDownMirrored:
transform = CGAffineTransformTranslate(transform, (_image).size.width, 0);
transform = CGAffineTransformScale(transform, -1, 1);
break;case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, (*image).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, (_image).size.width, (_image).size.height,
CGImageGetBitsPerComponent((_image).CGImage), 0,
CGImageGetColorSpace((_image).CGImage),
CGImageGetBitmapInfo((_image).CGImage));
CGContextConcatCTM(ctx, transform);
switch ((_image).imageOrientation)
{
case UIImageOrientationLeft:
case UIImageOrientationLeftMirrored:
case UIImageOrientationRight:
case UIImageOrientationRightMirrored:
// Grr...
CGContextDrawImage(ctx, CGRectMake(0,0,(_image).size.height,(_image).size.width), (*image).CGImage);
break;default: CGContextDrawImage(ctx, CGRectMake(0,0,(*image).size.width,(*image).size.height), (*image).CGImage); break;
}
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
*image = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return *image;
}
Is it available via CocoaPods?
- (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);
use this, it work
Agree with @aelam , High-resolution photos cause a pretty serious memory problem.
Sometimes memory can increase crazily 40M+.