Advertise Mobile SDKs Books Events Forum News Social Networking Support Us
Follow @iphonedevsdk on Twitter

Mockup & CodeGen, iPhone & iPad
($9.99)

Make your own iPhone apps
and run them live!
(free)

Manu
($0.99)

Want your application or service advertised on iPhone Dev SDK?

Go Back   iPhone Dev SDK Forum

View Single Post
Old 07-06-2009, 10:14 PM   #1 (permalink)
mmd30
Registered Member
 
Join Date: Jul 2009
Posts: 4
Default UIImagePickerController does not appear to report correct orientation of the image re

I am using the UIImagePickerController to capture a picture from the camera. I then scale and rotate the image using code that I has been posted repeatedly on various SDK forums. The problem appears that the UIImage returned to the UIImagePickerController's delegate is reporting the wrong orientation. Has anyone seen this issue before and if so, do you have any suggestions or solutions?

Here is the delegate's method to get the returned image. The UIImage passed into this method does not have the correct orientation.

Code:
- (void) imagePickerController:(UIImagePickerController *) picker
     didFinishPickingImage:(UIImage *) image
     editingInfo:(NSDictionary *) editingInfo

     {
selectedImage = [self scaleAndRotateImage:image];
selectedImageView.image = selectedImage;

}
Here is the scale and rotate code that I mentioned from numerous other posts.

Code:
- (UIImage *)scaleAndRotateImage:(UIImage *)image

{

     int kMaxResolution = 480; 


     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 = bounds.size.width / ratio;
          }
          else {
               bounds.size.height = kMaxResolution;
               bounds.size.width = 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 :NSInternalInconsistencyExceptionformat:@"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;
}
mmd30 is offline   Reply With Quote
 

» Advertisements
» Stats
Members: 158,870
Threads: 89,225
Posts: 380,694
Top Poster: BrianSlick (7,129)
Welcome to our newest member, triclopus
Powered by vBadvanced CMPS v3.1.0

All times are GMT -5. The time now is 06:44 AM.
Powered by vBulletin® Version 3.8.0
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.