-
-
Save alex-cellcity/1531596 to your computer and use it in GitHub Desktop.
| @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 |
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
Hi, same memory problem here (a huge memory peak).
Anybody knows the way to avoid this peak?