MGImage.mm 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. //
  2. // MGImage.m
  3. // MGBankCard
  4. //
  5. // Created by 张英堂 on 15/12/11.
  6. // Copyright © 2015年 megvii. All rights reserved.
  7. //
  8. #import "MGImage.h"
  9. #import <CoreGraphics/CoreGraphics.h>
  10. @implementation MGImage
  11. + (UIImage*)fixOrientationFromSampleBuffer:(CMSampleBufferRef)sampleBuffer
  12. orientation:(UIImageOrientation)orientation{
  13. UIImage *image2 = [self imageFromSampleBuffer:sampleBuffer orientation:orientation];
  14. return [self fixOrientationWithImage:image2];
  15. }
  16. + (UIImage*)imageFromSampleBuffer:(CMSampleBufferRef)sampleBuffer
  17. orientation:(UIImageOrientation) orientation{
  18. CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
  19. CVPixelBufferLockBaseAddress(imageBuffer, 0);
  20. void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
  21. size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
  22. size_t width = CVPixelBufferGetWidth(imageBuffer);
  23. size_t height = CVPixelBufferGetHeight(imageBuffer);
  24. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
  25. CGContextRef context = CGBitmapContextCreate(baseAddress,
  26. width,
  27. height,
  28. 8,
  29. bytesPerRow,
  30. colorSpace,
  31. kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
  32. CGImageRef quartzImage = CGBitmapContextCreateImage(context);
  33. CVPixelBufferUnlockBaseAddress(imageBuffer,0);
  34. UIImage *image = [UIImage imageWithCGImage:quartzImage scale:1.0 orientation:orientation];
  35. CGImageRelease(quartzImage);
  36. CGContextRelease(context);
  37. CGColorSpaceRelease(colorSpace);
  38. return image;
  39. }
  40. + (UIImage*)croppedImage:(UIImage *)image
  41. rect:(CGRect)bounds{
  42. CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], bounds);
  43. UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
  44. CGImageRelease(imageRef);
  45. return croppedImage;
  46. }
  47. UIImage* MGFixOrientationWithImageOrientation(UIImage *image, UIImageOrientation orientation){
  48. CGAffineTransform transform = CGAffineTransformIdentity;
  49. CGFloat height = 0, width = 0;
  50. switch (orientation) {
  51. case UIImageOrientationRight:
  52. {
  53. transform = CGAffineTransformRotate(transform, -M_PI_2);
  54. transform = CGAffineTransformTranslate(transform, -image.size.width, 0);
  55. width = image.size.height;
  56. height = image.size.width;
  57. }
  58. break;
  59. default:
  60. {
  61. width = image.size.width;
  62. height = image.size.height;
  63. }
  64. break;
  65. }
  66. CGContextRef ctx = CGBitmapContextCreate(NULL,
  67. width,
  68. height,
  69. CGImageGetBitsPerComponent(image.CGImage),
  70. 0,
  71. CGImageGetColorSpace(image.CGImage),
  72. CGImageGetBitmapInfo(image.CGImage));
  73. CGContextConcatCTM(ctx, transform);
  74. switch (image.imageOrientation) {
  75. case UIImageOrientationRight:
  76. {
  77. CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
  78. }
  79. break;
  80. case UIImageOrientationRightMirrored:
  81. {
  82. CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
  83. }
  84. break;
  85. default:
  86. {
  87. CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
  88. }
  89. break;
  90. }
  91. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  92. UIImage *resultImage = [UIImage imageWithCGImage:cgimg];
  93. CGContextRelease(ctx);
  94. CGImageRelease(cgimg);
  95. return resultImage;
  96. }
  97. + (UIImage*)fixOrientationWithImage:(UIImage *)image{
  98. if (image.imageOrientation == UIImageOrientationUp) return image;
  99. CGAffineTransform transform = CGAffineTransformIdentity;
  100. switch (image.imageOrientation) {
  101. case UIImageOrientationDown:
  102. case UIImageOrientationDownMirrored:
  103. transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
  104. transform = CGAffineTransformRotate(transform, M_PI);
  105. break;
  106. case UIImageOrientationLeft:
  107. case UIImageOrientationLeftMirrored:
  108. transform = CGAffineTransformTranslate(transform, image.size.width, 0);
  109. transform = CGAffineTransformRotate(transform, M_PI_2);
  110. break;
  111. case UIImageOrientationRight:
  112. case UIImageOrientationRightMirrored:
  113. transform = CGAffineTransformTranslate(transform, 0, image.size.height);
  114. transform = CGAffineTransformRotate(transform, -M_PI_2);
  115. break;
  116. case UIImageOrientationUp:
  117. case UIImageOrientationUpMirrored:
  118. break;
  119. }
  120. switch (image.imageOrientation) {
  121. case UIImageOrientationUpMirrored:
  122. case UIImageOrientationDownMirrored:
  123. transform = CGAffineTransformTranslate(transform, image.size.width, 0);
  124. transform = CGAffineTransformScale(transform, -1, 1);
  125. break;
  126. case UIImageOrientationLeftMirrored:
  127. case UIImageOrientationRightMirrored:
  128. transform = CGAffineTransformTranslate(transform, image.size.height, 0);
  129. transform = CGAffineTransformScale(transform, -1, 1);
  130. break;
  131. case UIImageOrientationUp:
  132. case UIImageOrientationDown:
  133. case UIImageOrientationLeft:
  134. case UIImageOrientationRight:
  135. break;
  136. }
  137. CGContextRef ctx = CGBitmapContextCreate(NULL,
  138. image.size.width,
  139. image.size.height,
  140. CGImageGetBitsPerComponent(image.CGImage),
  141. 0,
  142. CGImageGetColorSpace(image.CGImage),
  143. CGImageGetBitmapInfo(image.CGImage));
  144. CGContextConcatCTM(ctx, transform);
  145. switch (image.imageOrientation) {
  146. case UIImageOrientationLeft:
  147. case UIImageOrientationLeftMirrored:
  148. case UIImageOrientationRight:
  149. case UIImageOrientationRightMirrored:
  150. CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
  151. break;
  152. default:
  153. CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
  154. break;
  155. }
  156. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  157. UIImage *img = [UIImage imageWithCGImage:cgimg];
  158. CGContextRelease(ctx);
  159. CGImageRelease(cgimg);
  160. return img;
  161. }
  162. + (CGFloat)angleOffsetFromPortraitOrientationToOrientation:(AVCaptureVideoOrientation)orientation
  163. {
  164. CGFloat angle = 0.0;
  165. switch ( orientation )
  166. {
  167. case AVCaptureVideoOrientationPortrait:
  168. angle = 0.0;
  169. break;
  170. case AVCaptureVideoOrientationPortraitUpsideDown:
  171. angle = M_PI;
  172. break;
  173. case AVCaptureVideoOrientationLandscapeRight:
  174. angle = -M_PI_2;
  175. break;
  176. case AVCaptureVideoOrientationLandscapeLeft:
  177. angle = M_PI_2;
  178. break;
  179. default:
  180. break;
  181. }
  182. return angle;
  183. }
  184. @end