diff options
author | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2010-05-26 18:06:02 +0000 |
---|---|---|
committer | gtm.daemon <gtm.daemon@7dc7ac4e-7543-0410-b95c-c1676fc8e2a3> | 2010-05-26 18:06:02 +0000 |
commit | c8b442e4af5f12d91450e9b1fcce1468aa49de4e (patch) | |
tree | 6b4025ace69838de8fedcb96de8db0b0aa14d58a /iPhone/GTMUIImage+Resize.m | |
parent | 69491c3dd52dffcb3fdbaffeffb63483fbd15088 (diff) |
[Author: caseyho]
UIImage rotate method plus tests.
R=altse
APPROVED=altse
DELTA=152 (152 added, 0 deleted, 0 changed)
Diffstat (limited to 'iPhone/GTMUIImage+Resize.m')
-rw-r--r-- | iPhone/GTMUIImage+Resize.m | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/iPhone/GTMUIImage+Resize.m b/iPhone/GTMUIImage+Resize.m index 9dd2144..49b82c8 100644 --- a/iPhone/GTMUIImage+Resize.m +++ b/iPhone/GTMUIImage+Resize.m @@ -17,6 +17,16 @@ // #import "GTMUIImage+Resize.h" +#import "GTMDefines.h" + +GTM_INLINE CGSize swapWidthAndHeight(CGSize size) { + CGFloat tempWidth = size.width; + + size.width = size.height; + size.height = tempWidth; + + return size; +} @implementation UIImage (GTMUIImageResizeAdditions) @@ -83,4 +93,94 @@ UIGraphicsEndImageContext(); return resizedPhoto; } + +// Based on code by Trevor Harmon: +// http://vocaro.com/trevor/blog/wp-content/uploads/2009/10/UIImage+Resize.h +// http://vocaro.com/trevor/blog/wp-content/uploads/2009/10/UIImage+Resize.m +- (UIImage *)gtm_imageByRotating:(UIImageOrientation)orientation { + CGRect bounds = CGRectZero; + CGRect rect = CGRectZero; + CGAffineTransform transform = CGAffineTransformIdentity; + + bounds.size = [self size]; + rect.size = [self size]; + + switch (orientation) { + case UIImageOrientationUp: + return [UIImage imageWithCGImage:[self CGImage]]; + + case UIImageOrientationUpMirrored: + transform = CGAffineTransformMakeTranslation(rect.size.width, 0.0); + transform = CGAffineTransformScale(transform, -1.0, 1.0); + break; + + case UIImageOrientationDown: + transform = CGAffineTransformMakeTranslation(rect.size.width, + rect.size.height); + transform = CGAffineTransformRotate(transform, M_PI); + break; + + case UIImageOrientationDownMirrored: + transform = CGAffineTransformMakeTranslation(0.0, rect.size.height); + transform = CGAffineTransformScale(transform, 1.0, -1.0); + break; + + case UIImageOrientationLeft: + bounds.size = swapWidthAndHeight(bounds.size); + transform = CGAffineTransformMakeTranslation(0.0, rect.size.width); + transform = CGAffineTransformRotate(transform, -M_PI_2); + break; + + case UIImageOrientationLeftMirrored: + bounds.size = swapWidthAndHeight(bounds.size); + transform = CGAffineTransformMakeTranslation(rect.size.height, + rect.size.width); + transform = CGAffineTransformScale(transform, -1.0, 1.0); + transform = CGAffineTransformRotate(transform, -M_PI_2); + break; + + case UIImageOrientationRight: + bounds.size = swapWidthAndHeight(bounds.size); + transform = CGAffineTransformMakeTranslation(rect.size.height, 0.0); + transform = CGAffineTransformRotate(transform, M_PI_2); + break; + + case UIImageOrientationRightMirrored: + bounds.size = swapWidthAndHeight(bounds.size); + transform = CGAffineTransformMakeScale(-1.0, 1.0); + transform = CGAffineTransformRotate(transform, M_PI_2); + break; + + default: + _GTMDevAssert(false, @"Invalid orientation %d", orientation); + return nil; + } + + UIGraphicsBeginImageContext(bounds.size); + CGContextRef context = UIGraphicsGetCurrentContext(); + + switch (orientation) { + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + CGContextScaleCTM(context, -1.0, 1.0); + CGContextTranslateCTM(context, -rect.size.height, 0.0); + break; + + default: + CGContextScaleCTM(context, 1.0, -1.0); + CGContextTranslateCTM(context, 0.0, -rect.size.height); + break; + } + + CGContextConcatCTM(context, transform); + CGContextDrawImage(context, rect, [self CGImage]); + + UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext(); + UIGraphicsEndImageContext(); + + return rotatedImage; +} + @end |