Created
July 27, 2012 16:48
-
-
Save iamcam/3189094 to your computer and use it in GitHub Desktop.
Image Picker Rotation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { | |
NSLog(@"Info: %@", info); | |
UIImage *img = [info objectForKey:UIImagePickerControllerEditedImage]; | |
UIImage* originalImg = [self scaleAndRotateImage:[info objectForKey:UIImagePickerControllerOriginalImage]]; | |
/*** OPTION 1 - JUST USE THE "FULL SIZE" IMAGE FROM THE PICKER CONTROLLER ***/ | |
// [self usePhoto:originalImg]; | |
NSLog(@"Original Size w %.1f x h %.1f\tScale: %.1f", originalImg.size.width, originalImg.size.height, originalImg.scale); | |
NSLog(@"Edited Size w %.1f x h %.1f\tScale: %.1f", img.size.width, img.size.height, img.scale ); | |
NSLog(@"Orientation %d",originalImg.imageOrientation); | |
/*** OPTION 2 - USE THE ORIGINAL FULL RESOLUTION IMAGE FROM THE PHOTO LIBRARY ***/ | |
NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL]; | |
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; | |
[library assetForURL:referenceURL resultBlock:^(ALAsset *asset) { | |
ALAssetRepresentation *rep = [asset defaultRepresentation]; | |
/** I'm not sure this is even the best weay, but since we are using orientation in scaleAndRotateImage: might as well use it **/ | |
// Keeps our orientation proper, from http://stackoverflow.com/a/9447468/694080 | |
// Retrieve the image orientation from the ALAsset | |
UIImageOrientation orientation = UIImageOrientationUp; | |
NSNumber* orientationValue = [asset valueForProperty:@"ALAssetPropertyOrientation"]; | |
if (orientationValue != nil) { | |
orientation = [orientationValue intValue]; | |
} | |
UIImage *asstImg = [self scaleAndRotateImage:[UIImage imageWithCGImage:[rep fullResolutionImage] scale:[rep scale] orientation:orientation]]; | |
NSLog(@"AssImg Size w %.1f x h %.1f\tScale: %.1f", asstImg.size.width, asstImg.size.height, asstImg.scale ); | |
[self usePhoto:asstImg]; | |
} failureBlock:^(NSError *error) { | |
// NSLog(@"Sorry, error"); | |
}]; | |
[picker dismissModalViewControllerAnimated:YES]; | |
} | |
/* | |
Code from: http://discussions.apple.com/thread.jspa?messageID=7949889 | |
via http://stackoverflow.com/a/538064/694080 | |
This method rotates an image based off of its orientation - which is required | |
when using images from the camera roll, as they are opened in their native orientation. | |
This takes care of the transformation so we can get the correct output for GPUImage | |
*/ | |
- (UIImage *)scaleAndRotateImage:(UIImage *)image { | |
int kMaxResolution = MAX(image.size.width, image.size.height); // Or whatever | |
CGImageRef imgRef = image.CGImage; | |
CGFloat width = CGImageGetWidth(imgRef); | |
CGFloat height = CGImageGetHeight(imgRef); | |
CGAffineTransform transform = CGAffineTransformIdentity; | |
CGRect bounds = CGRectMake(0, 0, width, height); | |
if (width > kMaxResolution || height > kMaxResolution) { | |
CGFloat ratio = width/height; | |
if (ratio > 1) { | |
bounds.size.width = kMaxResolution; | |
bounds.size.height = roundf(bounds.size.width / ratio); | |
} | |
else { | |
bounds.size.height = kMaxResolution; | |
bounds.size.width = roundf(bounds.size.height * ratio); | |
} | |
} | |
CGFloat scaleRatio = bounds.size.width / width; | |
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef)); | |
CGFloat boundHeight; | |
UIImageOrientation orient = image.imageOrientation; | |
switch(orient) { | |
case UIImageOrientationUp: //EXIF = 1 | |
transform = CGAffineTransformIdentity; | |
break; | |
case UIImageOrientationUpMirrored: //EXIF = 2 | |
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0); | |
transform = CGAffineTransformScale(transform, -1.0, 1.0); | |
break; | |
case UIImageOrientationDown: //EXIF = 3 | |
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height); | |
transform = CGAffineTransformRotate(transform, M_PI); | |
break; | |
case UIImageOrientationDownMirrored: //EXIF = 4 | |
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height); | |
transform = CGAffineTransformScale(transform, 1.0, -1.0); | |
break; | |
case UIImageOrientationLeftMirrored: //EXIF = 5 | |
boundHeight = bounds.size.height; | |
bounds.size.height = bounds.size.width; | |
bounds.size.width = boundHeight; | |
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width); | |
transform = CGAffineTransformScale(transform, -1.0, 1.0); | |
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); | |
break; | |
case UIImageOrientationLeft: //EXIF = 6 | |
boundHeight = bounds.size.height; | |
bounds.size.height = bounds.size.width; | |
bounds.size.width = boundHeight; | |
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width); | |
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0); | |
break; | |
case UIImageOrientationRightMirrored: //EXIF = 7 | |
boundHeight = bounds.size.height; | |
bounds.size.height = bounds.size.width; | |
bounds.size.width = boundHeight; | |
transform = CGAffineTransformMakeScale(-1.0, 1.0); | |
transform = CGAffineTransformRotate(transform, M_PI / 2.0); | |
break; | |
case UIImageOrientationRight: //EXIF = 8 | |
boundHeight = bounds.size.height; | |
bounds.size.height = bounds.size.width; | |
bounds.size.width = boundHeight; | |
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0); | |
transform = CGAffineTransformRotate(transform, M_PI / 2.0); | |
break; | |
default: | |
[NSException raise:NSInternalInconsistencyException format:@"Invalid image orientation"]; | |
} | |
UIGraphicsBeginImageContext(bounds.size); | |
CGContextRef context = UIGraphicsGetCurrentContext(); | |
if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft) { | |
CGContextScaleCTM(context, -scaleRatio, scaleRatio); | |
CGContextTranslateCTM(context, -height, 0); | |
} | |
else { | |
CGContextScaleCTM(context, scaleRatio, -scaleRatio); | |
CGContextTranslateCTM(context, 0, -height); | |
} | |
CGContextConcatCTM(context, transform); | |
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef); | |
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext(); | |
UIGraphicsEndImageContext(); | |
return imageCopy; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
does this spend too much memory? if it runs on iPhone 4S the image would be very large