The iphone image taken from the camera automatically rotates -90 degrees

Programmatically, I selected an image from my camera in my application. It was extracted beautifully, but when I switch to another view and reject this view, my image automatically rotates -90 degrees.

and this change only happens the first time after that, when I shift any changes, it means that the image remains at -90 degrees, and this only happens when I recorded the image from the camera. when I get the image from the photo library, the problem was not found.

next image is my original image

Original image

and this is a rotated image

rotated image

I do not know why this change is occurring.

+12
ios objective-c iphone xcode camera
Feb 17 2018-12-12T00:
source share
6 answers

you need to use this function to rotate the image captured by the 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; } 
+14
Feb 17 2018-12-17T00:
source share

The easiest way to overcome this problem is to scale the image inside the didFinishPickingImage delegate. You can use the following code to scale by importing the " UIImage+ImageScaling.h " class.

theImage =[UIImage imageWithImage:image scaledToSizeWithSameAspectRatio:CGSizeMake(400, 300)]; // for iphone.

+4
Aug 27 2018-12-12T00:
source share

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; } 
+1
Sep 09 '15 at 10:05
source share

Try this property

@property (nonatomic) CGAffineTransform cameraViewTransform

and rotate from -90 degrees, and then capture the image. If it doesn't work, use the code asked by Cocoa Questions.

0
Feb 17 '12 at 7:14
source share

If you still need some solution, just send this link where I posted my answer to this problem, just refer to editing and editing 1 also see the last 2 or 3 comments for further links

0
Jul 04 2018-12-12T00:
source share

This is due to the orientation of the image. therefore keep the original orientation of the image. you will get the image orientation in the delegate method of the UIImagePickerController

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

code example:

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *sourceImage = [info valueForKey:UIImagePickerControllerOriginalImage]; NSData *data = UIImagePNGRepresentation(sourceImage); UIImage *tmp = [UIImage imageWithData:data]; UIImage *afterFixingOrientation = [UIImage imageWithCGImage:tmp.CGImage scale:sourceImage.scale orientation:sourceImage.imageOrientation]; [self.imagePickerController dismissViewControllerAnimated:YES completion:nil]; } 
-one
Oct 30 '14 at 16:24
source share



All Articles