UIImage中的方向属性导致UIImage转 Mat 图片变形

最近在做一个项目,需要把相机拍照原图转成Mat ,但发现在把UIImage转成Mat类型时候图像严重变形,最后发现原来是图片的imageOrientation属性所导致。


解决办法:

+ (UIImage *)fixOrientation:(UIImage *)aImage {              // No-op if the orientation is already correct       if (aImage.imageOrientation == UIImageOrientationUp)            return aImage;              // We need to calculate the proper transformation to make the image upright.       // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.       CGAffineTransform transform = CGAffineTransformIdentity;              switch (aImage.imageOrientation) {           case UIImageOrientationDown:           case UIImageOrientationDownMirrored:               transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);               transform = CGAffineTransformRotate(transform, M_PI);               break;                          case UIImageOrientationLeft:           case UIImageOrientationLeftMirrored:               transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);               transform = CGAffineTransformRotate(transform, M_PI_2);               break;                          case UIImageOrientationRight:           case UIImageOrientationRightMirrored:               transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);               transform = CGAffineTransformRotate(transform, -M_PI_2);               break;           default:               break;       }              switch (aImage.imageOrientation) {           case UIImageOrientationUpMirrored:           case UIImageOrientationDownMirrored:               transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);               transform = CGAffineTransformScale(transform, -1, 1);               break;                          case UIImageOrientationLeftMirrored:           case UIImageOrientationRightMirrored:               transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);               transform = CGAffineTransformScale(transform, -1, 1);               break;           default:               break;       }              // Now we draw the underlying CGImage into a new context, applying the transform       // calculated above.       CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,                                                CGImageGetBitsPerComponent(aImage.CGImage), 0,                                                CGImageGetColorSpace(aImage.CGImage),                                                CGImageGetBitmapInfo(aImage.CGImage));       CGContextConcatCTM(ctx, transform);       switch (aImage.imageOrientation) {           case UIImageOrientationLeft:           case UIImageOrientationLeftMirrored:           case UIImageOrientationRight:           case UIImageOrientationRightMirrored:               // Grr...               CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);               break;                          default:               CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);               break;       }              // And now we just create a new UIImage from the drawing context       CGImageRef cgimg = CGBitmapContextCreateImage(ctx);       UIImage *img = [UIImage imageWithCGImage:cgimg];       CGContextRelease(ctx);       CGImageRelease(cgimg);       return img;   }  

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容