UIImage+fixOrientation.m 3.3 KB

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