@@ -135,4 +135,83 @@ + (NSString *)generateCacheFilePath:(NSString *)extension{
135135 return filePath;
136136}
137137
138+ +(UIImage *)scaleAndRotateImage : (UIImage *)image {
139+ // No-op if the orientation is already correct
140+ if (image.imageOrientation == UIImageOrientationUp) return image;
141+
142+ // We need to calculate the proper transformation to make the image upright.
143+ // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
144+ CGAffineTransform transform = CGAffineTransformIdentity;
145+
146+ switch (image.imageOrientation ) {
147+ case UIImageOrientationDown:
148+ case UIImageOrientationDownMirrored:
149+ transform = CGAffineTransformTranslate (transform, image.size .width , image.size .height );
150+ transform = CGAffineTransformRotate (transform, M_PI);
151+ break ;
152+
153+ case UIImageOrientationLeft:
154+ case UIImageOrientationLeftMirrored:
155+ transform = CGAffineTransformTranslate (transform, image.size .width , 0 );
156+ transform = CGAffineTransformRotate (transform, M_PI_2);
157+ break ;
158+
159+ case UIImageOrientationRight:
160+ case UIImageOrientationRightMirrored:
161+ transform = CGAffineTransformTranslate (transform, 0 , image.size .height );
162+ transform = CGAffineTransformRotate (transform, -M_PI_2);
163+ break ;
164+ case UIImageOrientationUp:
165+ case UIImageOrientationUpMirrored:
166+ break ;
167+ }
168+
169+ switch (image.imageOrientation ) {
170+ case UIImageOrientationUpMirrored:
171+ case UIImageOrientationDownMirrored:
172+ transform = CGAffineTransformTranslate (transform, image.size .width , 0 );
173+ transform = CGAffineTransformScale (transform, -1 , 1 );
174+ break ;
175+
176+ case UIImageOrientationLeftMirrored:
177+ case UIImageOrientationRightMirrored:
178+ transform = CGAffineTransformTranslate (transform, image.size .height , 0 );
179+ transform = CGAffineTransformScale (transform, -1 , 1 );
180+ break ;
181+ case UIImageOrientationUp:
182+ case UIImageOrientationDown:
183+ case UIImageOrientationLeft:
184+ case UIImageOrientationRight:
185+ break ;
186+ }
187+
188+ // Now we draw the underlying CGImage into a new context, applying the transform
189+ // calculated above.
190+ CGContextRef ctx = CGBitmapContextCreate (NULL , image.size .width , image.size .height ,
191+ CGImageGetBitsPerComponent (image.CGImage ), 0 ,
192+ CGImageGetColorSpace (image.CGImage ),
193+ CGImageGetBitmapInfo (image.CGImage ));
194+ CGContextConcatCTM (ctx, transform);
195+ switch (image.imageOrientation ) {
196+ case UIImageOrientationLeft:
197+ case UIImageOrientationLeftMirrored:
198+ case UIImageOrientationRight:
199+ case UIImageOrientationRightMirrored:
200+ // Grr...
201+ CGContextDrawImage (ctx, CGRectMake (0 ,0 ,image.size .height ,image.size .width ), image.CGImage );
202+ break ;
203+
204+ default :
205+ CGContextDrawImage (ctx, CGRectMake (0 ,0 ,image.size .width ,image.size .height ), image.CGImage );
206+ break ;
207+ }
208+
209+ // And now we just create a new UIImage from the drawing context
210+ CGImageRef cgimg = CGBitmapContextCreateImage (ctx);
211+ UIImage *img = [UIImage imageWithCGImage: cgimg];
212+ CGContextRelease (ctx);
213+ CGImageRelease (cgimg);
214+ return img;
215+ }
216+
138217@end
0 commit comments