UIImage+fixOrientation.m 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. }
  33. switch (self.imageOrientation) {
  34. case UIImageOrientationUpMirrored:
  35. case UIImageOrientationDownMirrored:
  36. transform = CGAffineTransformTranslate(transform, self.size.width, 0);
  37. transform = CGAffineTransformScale(transform, -1, 1);
  38. break;
  39. case UIImageOrientationLeftMirrored:
  40. case UIImageOrientationRightMirrored:
  41. transform = CGAffineTransformTranslate(transform, self.size.height, 0);
  42. transform = CGAffineTransformScale(transform, -1, 1);
  43. break;
  44. }
  45. // Now we draw the underlying CGImage into a new context, applying the transform
  46. // calculated above.
  47. CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height,
  48. CGImageGetBitsPerComponent(self.CGImage), 0,
  49. CGImageGetColorSpace(self.CGImage),
  50. CGImageGetBitmapInfo(self.CGImage));
  51. CGContextConcatCTM(ctx, transform);
  52. switch (self.imageOrientation) {
  53. case UIImageOrientationLeft:
  54. case UIImageOrientationLeftMirrored:
  55. case UIImageOrientationRight:
  56. case UIImageOrientationRightMirrored:
  57. // Grr...
  58. CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage);
  59. break;
  60. default:
  61. CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage);
  62. break;
  63. }
  64. // And now we just create a new UIImage from the drawing context
  65. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  66. UIImage *img = [UIImage imageWithCGImage:cgimg];
  67. CGContextRelease(ctx);
  68. CGImageRelease(cgimg);
  69. return img;
  70. }
  71. @end