From 156686caddf622d2913da0ff258599cdf0b12216 Mon Sep 17 00:00:00 2001 From: Muhammad Numan Date: Tue, 22 Jun 2021 21:00:18 +0500 Subject: [PATCH] fix: rorate issue of heci image --- ios/Compressor.m | 1 + ios/Image/ImageCompressor.h | 1 + ios/Image/ImageCompressor.m | 79 +++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/ios/Compressor.m b/ios/Compressor.m index f56b5a6..6ab0e03 100644 --- a/ios/Compressor.m +++ b/ios/Compressor.m @@ -33,6 +33,7 @@ @implementation Compressor reject(@"unsupported_value", @"Unsupported value type.", nil); return; } + image=[ImageCompressor scaleAndRotateImage:image]; NSString *outputExtension=[ImageCompressorOptions getOutputInString:options.output]; UIImage *resizedImage = [ImageCompressor resize:image maxWidth:options.maxWidth maxHeight:options.maxHeight]; Boolean isBase64=options.returnableOutputType ==rbase64; diff --git a/ios/Image/ImageCompressor.h b/ios/Image/ImageCompressor.h index c309f91..7899474 100644 --- a/ios/Image/ImageCompressor.h +++ b/ios/Image/ImageCompressor.h @@ -9,4 +9,5 @@ + (UIImage *)resize:(UIImage *)image maxWidth:(int)maxWidth maxHeight:(int)maxHeight; + (NSString *)compress:(UIImage *)image output:(enum OutputType)output quality:(float)quality outputExtension:(NSString*)outputExtension isBase64:(Boolean)isBase64; ++ (UIImage *)scaleAndRotateImage:(UIImage *)image; @end diff --git a/ios/Image/ImageCompressor.m b/ios/Image/ImageCompressor.m index 6cda123..d4bc75c 100644 --- a/ios/Image/ImageCompressor.m +++ b/ios/Image/ImageCompressor.m @@ -135,4 +135,83 @@ + (NSString *)generateCacheFilePath:(NSString *)extension{ return filePath; } ++(UIImage *)scaleAndRotateImage:(UIImage *)image{ + // No-op if the orientation is already correct + if (image.imageOrientation == UIImageOrientationUp) return image; + + // 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 (image.imageOrientation) { + case UIImageOrientationDown: + case UIImageOrientationDownMirrored: + transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height); + transform = CGAffineTransformRotate(transform, M_PI); + break; + + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + transform = CGAffineTransformTranslate(transform, image.size.width, 0); + transform = CGAffineTransformRotate(transform, M_PI_2); + break; + + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + transform = CGAffineTransformTranslate(transform, 0, image.size.height); + transform = CGAffineTransformRotate(transform, -M_PI_2); + break; + case UIImageOrientationUp: + case UIImageOrientationUpMirrored: + break; + } + + switch (image.imageOrientation) { + case UIImageOrientationUpMirrored: + case UIImageOrientationDownMirrored: + transform = CGAffineTransformTranslate(transform, image.size.width, 0); + transform = CGAffineTransformScale(transform, -1, 1); + break; + + case UIImageOrientationLeftMirrored: + case UIImageOrientationRightMirrored: + transform = CGAffineTransformTranslate(transform, image.size.height, 0); + transform = CGAffineTransformScale(transform, -1, 1); + break; + case UIImageOrientationUp: + case UIImageOrientationDown: + case UIImageOrientationLeft: + case UIImageOrientationRight: + break; + } + + // Now we draw the underlying CGImage into a new context, applying the transform + // calculated above. + CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height, + CGImageGetBitsPerComponent(image.CGImage), 0, + CGImageGetColorSpace(image.CGImage), + CGImageGetBitmapInfo(image.CGImage)); + CGContextConcatCTM(ctx, transform); + switch (image.imageOrientation) { + case UIImageOrientationLeft: + case UIImageOrientationLeftMirrored: + case UIImageOrientationRight: + case UIImageOrientationRightMirrored: + // Grr... + CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage); + break; + + default: + CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.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; +} + @end