-
-
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?