imagen del iphone capturada de la cámara gira automáticamente -90 grados

Progtwigtivamente, he obtenido una imagen de mi cámara en mi aplicación. Se ha obtenido muy bien, pero cuando cambio a otra vista y desecho esa vista en ese momento, mi imagen gira automáticamente -90 grados.

y este cambio ocurre solo la primera vez después de que cuando cambio no ocurre ningún cambio significa que la imagen se mantiene en estado de -90 grados y esto sucede solo cuando capturé la imagen de la cámara. cuando obtengo una imagen de la biblioteca de fotos, no se ha encontrado ningún problema.

la siguiente imagen es mi imagen original

Imagen original

y esta es una imagen rotada

imagen girada

No sé por qué ocurre este cambio.

tienes que usar esta función para rotar la imagen capturada por la cámara

- (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; } 

La forma más sencilla de superar este problema es escalar la imagen dentro del delegado didFinishPickingImage . Puede usar el siguiente código para escalar mediante la importación de una clase ” UIImage+ImageScaling.h “.

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

Este método funciona para mí,

 - (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; } 

Prueba esta propiedad

@property (nonatomic) CGAffineTransform cameraViewTransform

y gire con -90 grados y luego capture la imagen. Si no funciona, use el código proporcionado por Cocoa Matters.

Si todavía necesita alguna solución, solo remita este enlace donde publiqué mi respuesta para este problema, solo remita editar y editar 1, también vea los últimos 2 o 3 comentarios para mayor referencia

Se debe a la orientación de tu imagen. así que mantén la orientación de la imagen original. Obtendrás la orientación de la imagen en tu método delegado UIImagePickerController

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

Código de muestra:

 - (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]; }