iphone image captured from camera rotate -90 degree automatically
Solution 1
you have to use this function to rotate image captured by camera
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingImage:(UIImage *)image
editingInfo:(NSDictionary *)editingInfo
{
image = [self scaleAndRotateImage:image];
[self useImage:image];
[[picker parentViewController] dismissModalViewControllerAnimated:YES];
}
- (void)scaleAndRotateImage:(UIImage *)image
{
int kMaxResolution = 320; // 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 = 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: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();
[self setRotatedImage:imageCopy];
//return imageCopy;
}
Solution 2
The most simplest way to overcome this problem is by scaling the image inside didFinishPickingImage
delegate. You can use the following code to scale by importing a class "UIImage+ImageScaling.h
".
theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)];
// for iphone.
Solution 3
The bad behavior has now changed with 13.4. Images are now captured with accurate orientation.
Solution 4
This method works for me,
- (UIImage*) rotateImageAppropriately:(UIImage*)imageToRotate
{
UIImage* properlyRotatedImage;
CGImageRef imageRef = [imageToRotate CGImage];
if (imageToRotate.imageOrientation == 0)
{
properlyRotatedImage = imageToRotate;
}
else if (imageToRotate.imageOrientation == 3)
{
CGSize imgsize = imageToRotate.size;
UIGraphicsBeginImageContext(imgsize);
[imageToRotate drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)];
properlyRotatedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
else if (imageToRotate.imageOrientation == 1)
{
properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1];
}
return properlyRotatedImage;
}
iPhone
Updated on June 03, 2022Comments
-
iPhone almost 2 years
Programatically I have fetched image from my camera in my app. It has been fetched nicely but when I shift to another view and dismiss that view at that time my image automatically rotate -90 degree.
and this change occurs only first time after that when I shift no change occurs means image stays in -90 degree state and this happens only when I captued image from camera. when I fetch image from photo library no issue has been found.
following image is my original image
and this is rotated image
I don't know why this change happen.
-
filou about 12 yearspretty much for such a little rotation .__.
-
Purva over 11 yearsi have the same problem in my app and i have tried your but it doesnt effect. Image still rotates. What can be the issue?
-
Hiren over 11 yearswhat's the issue please explain in detail
-
0x6A75616E over 11 yearsAfter running an image that was obtained from a AVCaptureVideoDataOutput within an AVCaptureSession as a CGImageRef converted directly to UIImage it doesn't seem to do anything. I changed the orient variable to be set to [[UIDevice currentDevice] orientation] (making sure this runs in the main thread) but the whole thing is still rotated by 90 deg. What's the recommended way to adjust for orientation?
-
Hiren over 11 years@thatjuan i didn't get your point. can you send me demo for this? so I can solve your problem
-
0x6A75616E over 11 years@Hi Ren I've posted a question about it here: stackoverflow.com/questions/13640746/… if you want to take a look