UIImage+FixOrientation.m 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #import "UIImage+FixOrientation.h"
  2. @implementation UIImage (fixOrientation)
  3. - (UIImage *)fixOrientation {
  4. // No-op if the orientation is already correct
  5. if (self.imageOrientation == UIImageOrientationUp) return self;
  6. // We need to calculate the proper transformation to make the image upright.
  7. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
  8. CGAffineTransform transform = CGAffineTransformIdentity;
  9. switch (self.imageOrientation) {
  10. case UIImageOrientationDown:
  11. case UIImageOrientationDownMirrored:
  12. transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height);
  13. transform = CGAffineTransformRotate(transform, M_PI);
  14. break;
  15. case UIImageOrientationLeft:
  16. case UIImageOrientationLeftMirrored:
  17. transform = CGAffineTransformTranslate(transform, self.size.width, 0);
  18. transform = CGAffineTransformRotate(transform, M_PI_2);
  19. break;
  20. case UIImageOrientationRight:
  21. case UIImageOrientationRightMirrored:
  22. transform = CGAffineTransformTranslate(transform, 0, self.size.height);
  23. transform = CGAffineTransformRotate(transform, -M_PI_2);
  24. break;
  25. case UIImageOrientationUp:
  26. case UIImageOrientationUpMirrored:
  27. break;
  28. }
  29. switch (self.imageOrientation) {
  30. case UIImageOrientationUpMirrored:
  31. case UIImageOrientationDownMirrored:
  32. transform = CGAffineTransformTranslate(transform, self.size.width, 0);
  33. transform = CGAffineTransformScale(transform, -1, 1);
  34. break;
  35. case UIImageOrientationLeftMirrored:
  36. case UIImageOrientationRightMirrored:
  37. transform = CGAffineTransformTranslate(transform, self.size.height, 0);
  38. transform = CGAffineTransformScale(transform, -1, 1);
  39. break;
  40. case UIImageOrientationUp:
  41. case UIImageOrientationDown:
  42. case UIImageOrientationLeft:
  43. case UIImageOrientationRight:
  44. break;
  45. }
  46. // Now we draw the underlying CGImage into a new context, applying the transform
  47. // calculated above.
  48. CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
  49. CGImageGetBitsPerComponent(self.CGImage), 0,
  50. CGImageGetColorSpace(self.CGImage),
  51. CGImageGetBitmapInfo(self.CGImage));
  52. CGContextConcatCTM(ctx, transform);
  53. switch (self.imageOrientation) {
  54. case UIImageOrientationLeft:
  55. case UIImageOrientationLeftMirrored:
  56. case UIImageOrientationRight:
  57. case UIImageOrientationRightMirrored:
  58. // Grr...
  59. CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
  60. break;
  61. default:
  62. CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
  63. break;
  64. }
  65. // And now we just create a new UIImage from the drawing context
  66. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  67. UIImage *img = [UIImage imageWithCGImage:cgimg];
  68. CGContextRelease(ctx);
  69. CGImageRelease(cgimg);
  70. return img;
  71. }
  72. @end