I struggled quite a bit with this problem, I was working on a project where I need to rotate the image, such as reordering pixels so that I can load it.
The first thing you need to do is determine the orientation, then delete this annoying metadata, then rotate the image.
So put this inside the didFinishPickingMediaWithInfo function:
UIImage * img = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; if ([info objectForKey:@"UIImagePickerControllerMediaMetadata"]) { //Rotate based on orientation switch ([[[info objectForKey:@"UIImagePickerControllerMediaMetadata"] objectForKey:@"Orientation"] intValue]) { case 3: //Rotate image to the left twice. img = [UIImage imageWithCGImage:[img CGImage]]; //Strip off that pesky meta data! img = [rotateImage rotateImage:[rotateImage rotateImage:img withRotationType:rotateLeft] withRotationType:rotateLeft]; break; case 6: img = [UIImage imageWithCGImage:[img CGImage]]; img = [rotateImage rotateImage:img withRotationType:rotateRight]; break; case 8: img = [UIImage imageWithCGImage:[img CGImage]]; img = [rotateImage rotateImage:img withRotationType:rotateLeft]; break; default: break; } }
And here is the resize function:
+(UIImage*)rotateImage:(UIImage*)image withRotationType:(rotationType)rotation{ CGImageRef imageRef = [image CGImage]; CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef); CGColorSpaceRef colorSpaceInfo = CGColorSpaceCreateDeviceRGB(); if (alphaInfo == kCGImageAlphaNone) alphaInfo = kCGImageAlphaNoneSkipLast; CGContextRef bitmap; bitmap = CGBitmapContextCreate(NULL, image.size.height, image.size.width, CGImageGetBitsPerComponent(imageRef), 4 * image.size.height, colorSpaceInfo, alphaInfo); CGColorSpaceRelease(colorSpaceInfo); if (rotation == rotateLeft) { CGContextTranslateCTM (bitmap, image.size.height, 0); CGContextRotateCTM (bitmap, radians(90)); } else{ CGContextTranslateCTM (bitmap, 0, image.size.width); CGContextRotateCTM (bitmap, radians(-90)); } CGContextDrawImage(bitmap, CGRectMake(0, 0, image.size.width, image.size.height), imageRef); CGImageRef ref = CGBitmapContextCreateImage(bitmap); UIImage *result = [UIImage imageWithCGImage:ref]; CGImageRelease(ref); CGContextRelease(bitmap); return result; }
Now the img variable contains a correctly rotated image.
Patrick T Nelson Mar 16 2018-12-12T00: 00Z
source share