Skip to content

Commit 156686c

Browse files
committed
fix: rorate issue of heci image
1 parent 1830173 commit 156686c

File tree

3 files changed

+81
-0
lines changed

3 files changed

+81
-0
lines changed

ios/Compressor.m

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ @implementation Compressor
3333
reject(@"unsupported_value", @"Unsupported value type.", nil);
3434
return;
3535
}
36+
image=[ImageCompressor scaleAndRotateImage:image];
3637
NSString *outputExtension=[ImageCompressorOptions getOutputInString:options.output];
3738
UIImage *resizedImage = [ImageCompressor resize:image maxWidth:options.maxWidth maxHeight:options.maxHeight];
3839
Boolean isBase64=options.returnableOutputType ==rbase64;

ios/Image/ImageCompressor.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99

1010
+ (UIImage *)resize:(UIImage *)image maxWidth:(int)maxWidth maxHeight:(int)maxHeight;
1111
+ (NSString *)compress:(UIImage *)image output:(enum OutputType)output quality:(float)quality outputExtension:(NSString*)outputExtension isBase64:(Boolean)isBase64;
12+
+ (UIImage *)scaleAndRotateImage:(UIImage *)image;
1213
@end

ios/Image/ImageCompressor.m

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,83 @@ + (NSString *)generateCacheFilePath:(NSString *)extension{
135135
return filePath;
136136
}
137137

138+
+(UIImage *)scaleAndRotateImage:(UIImage *)image{
139+
// No-op if the orientation is already correct
140+
if (image.imageOrientation == UIImageOrientationUp) return image;
141+
142+
// We need to calculate the proper transformation to make the image upright.
143+
// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
144+
CGAffineTransform transform = CGAffineTransformIdentity;
145+
146+
switch (image.imageOrientation) {
147+
case UIImageOrientationDown:
148+
case UIImageOrientationDownMirrored:
149+
transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
150+
transform = CGAffineTransformRotate(transform, M_PI);
151+
break;
152+
153+
case UIImageOrientationLeft:
154+
case UIImageOrientationLeftMirrored:
155+
transform = CGAffineTransformTranslate(transform, image.size.width, 0);
156+
transform = CGAffineTransformRotate(transform, M_PI_2);
157+
break;
158+
159+
case UIImageOrientationRight:
160+
case UIImageOrientationRightMirrored:
161+
transform = CGAffineTransformTranslate(transform, 0, image.size.height);
162+
transform = CGAffineTransformRotate(transform, -M_PI_2);
163+
break;
164+
case UIImageOrientationUp:
165+
case UIImageOrientationUpMirrored:
166+
break;
167+
}
168+
169+
switch (image.imageOrientation) {
170+
case UIImageOrientationUpMirrored:
171+
case UIImageOrientationDownMirrored:
172+
transform = CGAffineTransformTranslate(transform, image.size.width, 0);
173+
transform = CGAffineTransformScale(transform, -1, 1);
174+
break;
175+
176+
case UIImageOrientationLeftMirrored:
177+
case UIImageOrientationRightMirrored:
178+
transform = CGAffineTransformTranslate(transform, image.size.height, 0);
179+
transform = CGAffineTransformScale(transform, -1, 1);
180+
break;
181+
case UIImageOrientationUp:
182+
case UIImageOrientationDown:
183+
case UIImageOrientationLeft:
184+
case UIImageOrientationRight:
185+
break;
186+
}
187+
188+
// Now we draw the underlying CGImage into a new context, applying the transform
189+
// calculated above.
190+
CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
191+
CGImageGetBitsPerComponent(image.CGImage), 0,
192+
CGImageGetColorSpace(image.CGImage),
193+
CGImageGetBitmapInfo(image.CGImage));
194+
CGContextConcatCTM(ctx, transform);
195+
switch (image.imageOrientation) {
196+
case UIImageOrientationLeft:
197+
case UIImageOrientationLeftMirrored:
198+
case UIImageOrientationRight:
199+
case UIImageOrientationRightMirrored:
200+
// Grr...
201+
CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
202+
break;
203+
204+
default:
205+
CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
206+
break;
207+
}
208+
209+
// And now we just create a new UIImage from the drawing context
210+
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
211+
UIImage *img = [UIImage imageWithCGImage:cgimg];
212+
CGContextRelease(ctx);
213+
CGImageRelease(cgimg);
214+
return img;
215+
}
216+
138217
@end

0 commit comments

Comments
 (0)