Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

UIImagePickerController camera preview is portrait in landscape app

In my landscape-only iPhone application, I launch a UIImagePickerController to take a photo, but the live image displayed from the camera is in portrait orientation, with blank space around it. The image is rotated.

Once the camera button is pressed, the preview is very messy, with most of the preview off screen, and views not correctly aligned.

Apple has acknowledged that this is defect, and is working on it.

My question is, does anyone have a work-around (legal or illegal) that would allow me to get this working now. I wouldn't release to the App Store with an illegal fix, but I would have a much better app for user testing - currently the camera is pretty much unusable in landscape.

I will attach a simple test project and images if I can.

Edit - just to clarify, the image I get is correctly landscape. I want the camera & preview UIs to look right!


Camera

alt text

like image 248
Jane Sales Avatar asked Feb 11 '09 18:02

Jane Sales


People also ask

How do I change my iPhone camera from portrait to landscape?

Swipe down from the top-right corner of your screen to open Control Center. Tap the Portrait Orientation Lock button to make sure that it's off. Turn your iPhone sideways.


1 Answers

The answer is more ridiculous than you might think. I had the same problem and found a solution in a forum somewhere. Pass your taken image into a method like this:

// Code from: http://discussions.apple.com/thread.jspa?messageID=7949889 - (UIImage *)scaleAndRotateImage:(UIImage *)image {   int kMaxResolution = 640; // 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; } 

:(

like image 81
Alex Wayne Avatar answered Oct 03 '22 07:10

Alex Wayne