Update:
With iPhone OS 3.0+, the whole UIImagePickerController API has changed. This question and answer should be considered 2.2. legacy code.
When using
Better late than never: here's the source for the orientationTransformForImage function
CGAffineTransform orientationTransformForImage(UIImage *image, CGSize *newSize) {
CGImageRef img = [image CGImage];
CGFloat width = CGImageGetWidth(img);
CGFloat height = CGImageGetHeight(img);
CGSize size = CGSizeMake(width, height);
CGAffineTransform transform = CGAffineTransformIdentity;
CGFloat origHeight = size.height;
UIImageOrientation orient = image.imageOrientation;
switch(orient) { /* EXIF 1 to 8 */
case UIImageOrientationUp:
break;
case UIImageOrientationUpMirrored:
transform = CGAffineTransformMakeTranslation(width, 0.0f);
transform = CGAffineTransformScale(transform, -1.0f, 1.0f);
break;
case UIImageOrientationDown:
transform = CGAffineTransformMakeTranslation(width, height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationDownMirrored:
transform = CGAffineTransformMakeTranslation(0.0f, height);
transform = CGAffineTransformScale(transform, 1.0f, -1.0f);
break;
case UIImageOrientationLeftMirrored:
size.height = size.width;
size.width = origHeight;
transform = CGAffineTransformMakeTranslation(height, width);
transform = CGAffineTransformScale(transform, -1.0f, 1.0f);
transform = CGAffineTransformRotate(transform, 3.0f * M_PI / 2.0f);
break;
case UIImageOrientationLeft:
size.height = size.width;
size.width = origHeight;
transform = CGAffineTransformMakeTranslation(0.0f, width);
transform = CGAffineTransformRotate(transform, 3.0f * M_PI / 2.0f);
break;
case UIImageOrientationRightMirrored:
size.height = size.width;
size.width = origHeight;
transform = CGAffineTransformMakeScale(-1.0f, 1.0f);
transform = CGAffineTransformRotate(transform, M_PI / 2.0f);
break;
case UIImageOrientationRight:
size.height = size.width;
size.width = origHeight;
transform = CGAffineTransformMakeTranslation(height, 0.0f);
transform = CGAffineTransformRotate(transform, M_PI / 2.0f);
break;
default:
;
}
*newSize = size;
return transform;
}