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

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


UIImage中的方向属性导致UIImage转 Mat 图片变形_第1张图片

解决办法:

+ (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;   }  

你可能感兴趣的:(UIImage中的方向属性导致UIImage转 Mat 图片变形)