with uiimagepickercontrollerdelegate open how example and ios iphone cocoa-touch uiimage uiimagepickercontroller

ios - open - uiimagepickercontrollerdelegate swift 4



iOS UIImagePickerController orientaciĆ³n de la imagen despuĆ©s de la carga (15)

Estoy probando mi aplicación de iPhone en un iPhone iOS 3.1.3. Estoy seleccionando / capturando una imagen usando un UIImagePickerController :

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; [imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera]; [imagePicker setDelegate:self]; [self.navigationController presentModalViewController:imagePicker animated:YES]; [imagePicker release]; - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { self.image = [info objectForKey:UIImagePickerControllerOriginalImage]; imageView.image = self.image; [self.navigationController dismissModalViewControllerAnimated:YES]; submitButton.enabled = YES; }

Luego, en algún momento, lo envío a mi servidor web utilizando las clases ASI:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://example.com/myscript.php"]]; [request setDelegate:self]; [request setStringEncoding:NSUTF8StringEncoding]; [request setShouldContinueWhenAppEntersBackground:YES]; //other post keys/values [request setFile:UIImageJPEGRepresentation(self.image, 100.0f) withFileName:[NSString stringWithFormat:@"%d.jpg", [[NSDate date] timeIntervalSinceNow]] andContentType:@"image/jpg" forKey:@"imageFile"]; [request startAsynchronous];

El problema: cuando tomo una foto con el iPhone mientras lo mantengo en horizontal, la imagen se carga en el servidor y se ve como se espera. al tomar una foto con el teléfono en vertical, la imagen se carga y se ve como se giró 90 grados.

Mi aplicación está configurada para funcionar solo en modo vertical (al revés y regular).

¿Cómo puedo hacer que la imagen muestre siempre la orientación correcta después de subirla?

la imagen parece ser correcta como se muestra en un UIImageView (directamente después de tomar la foto), pero ver en el servidor dice lo contrario.


Actualización para Swift 3.1 basada en la Sourabh Sharma de Sourabh Sharma , con limpieza de código.

extension UIImage { func fixedOrientation() -> UIImage { if imageOrientation == .up { return self } var transform:CGAffineTransform = .identity switch imageOrientation { case .down, .downMirrored: transform = transform.translatedBy(x: size.width, y: size.height).rotated(by: .pi) case .left, .leftMirrored: transform = transform.translatedBy(x: size.width, y: 0).rotated(by: .pi/2) case .right, .rightMirrored: transform = transform.translatedBy(x: 0, y: size.height).rotated(by: -.pi/2) default: break } switch imageOrientation { case .upMirrored, .downMirrored: transform = transform.translatedBy(x: size.width, y: 0).scaledBy(x: -1, y: 1) case .leftMirrored, .rightMirrored: transform = transform.translatedBy(x: size.height, y: 0).scaledBy(x: -1, y: 1) default: break } let ctx = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: cgImage!.bitsPerComponent, bytesPerRow: 0, space: cgImage!.colorSpace!, bitmapInfo: cgImage!.bitmapInfo.rawValue)! ctx.concatenate(transform) switch imageOrientation { case .left, .leftMirrored, .right, .rightMirrored: ctx.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.height,height: size.width)) default: ctx.draw(cgImage!, in: CGRect(x: 0, y: 0, width: size.width,height: size.height)) } return UIImage(cgImage: ctx.makeImage()!) } }

Ejemplo de método de delegado de selector:

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { guard let originalImage = info[UIImagePickerControllerOriginalImage] as? UIImage else { return } let fixedImage = originalImage.fixedOrientation() // do your work }


Aquí está la extensión de UIImage para swift:

extension UIImage { func fixOrientation() -> UIImage { // No-op if the orientation is already correct if ( self.imageOrientation == UIImageOrientation.Up ) { return self; } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform: CGAffineTransform = CGAffineTransformIdentity if ( self.imageOrientation == UIImageOrientation.Down || self.imageOrientation == UIImageOrientation.DownMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height) transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) } if ( self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.width, 0) transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) } if ( self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored ) { transform = CGAffineTransformTranslate(transform, 0, self.size.height); transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)); } if ( self.imageOrientation == UIImageOrientation.UpMirrored || self.imageOrientation == UIImageOrientation.DownMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.width, 0) transform = CGAffineTransformScale(transform, -1, 1) } if ( self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.RightMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. var ctx: CGContextRef = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height), CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage), CGImageGetBitmapInfo(self.CGImage)); CGContextConcatCTM(ctx, transform) if ( self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored ) { CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage) } else { CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage) } // And now we just create a new UIImage from the drawing context and return it return UIImage(CGImage: CGBitmapContextCreateImage(ctx))! } }

Basado en el trabajo anterior de MetalHeart2003.


Aquí está una versión rápida de la respuesta por @ an0:

func normalizedImage() -> UIImage { if (self.imageOrientation == UIImageOrientation.Up) { return self; } UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale); let rect = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height) self.drawInRect(rect) let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext(); return normalizedImage; }

También en una función más general:

func fixOrientation(img:UIImage) -> UIImage { if (img.imageOrientation == UIImageOrientation.Up) { return img; } UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale); let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height) img.drawInRect(rect) let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext(); return normalizedImage; }

Versión Swift 3:

func fixOrientation(img: UIImage) -> UIImage { if (img.imageOrientation == .up) { return img } UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale) let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height) img.draw(in: rect) let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return normalizedImage }


Aquí hay una extensión de UIImage en Swift 2 basada en la respuesta aceptada por @Anomie. Utiliza un caso de interruptor más claro. También tiene en cuenta el valor opcional devuelto por CGBitmapContextCreateImage() .

extension UIImage { func rotateImageByOrientation() -> UIImage { // No-op if the orientation is already correct guard self.imageOrientation != .Up else { return self } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform = CGAffineTransformIdentity; switch (self.imageOrientation) { case .Down, .DownMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height) transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) case .Left, .LeftMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, 0) transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) case .Right, .RightMirrored: transform = CGAffineTransformTranslate(transform, 0, self.size.height) transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)) default: break } switch (self.imageOrientation) { case .UpMirrored, .DownMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, 0) transform = CGAffineTransformScale(transform, -1, 1) case .LeftMirrored, .RightMirrored: transform = CGAffineTransformTranslate(transform, self.size.height, 0) transform = CGAffineTransformScale(transform, -1, 1) default: break } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. let ctx = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height), CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage), CGImageGetBitmapInfo(self.CGImage).rawValue) CGContextConcatCTM(ctx, transform) switch (self.imageOrientation) { case .Left, .LeftMirrored, .Right, .RightMirrored: CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage) default: CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage) } // And now we just create a new UIImage from the drawing context if let cgImage = CGBitmapContextCreateImage(ctx) { return UIImage(CGImage: cgImage) } else { return self } } }


Descubrí una mucho más simple:

- (UIImage *)normalizedImage { if (self.imageOrientation == UIImageOrientationUp) return self; UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); [self drawInRect:(CGRect){0, 0, self.size}]; UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return normalizedImage; }

Por cierto: el código de @Anomie no tiene en cuenta la scale , por lo que no funcionará para imágenes 2x.


Esto es lo que he encontrado para solucionar el problema de orientación.

UIImage *initialImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; NSData *data = UIImagePNGRepresentation(self.initialImage); UIImage *tempImage = [UIImage imageWithData:data]; UIImage *fixedOrientationImage = [UIImage imageWithCGImage:tempImage.CGImage scale:initialImage.scale orientation:self.initialImage.imageOrientation]; initialImage = fixedOrientationImage;

EDITAR:

UIImage *initialImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; NSData *data = UIImagePNGRepresentation(self.initialImage); initialImage = [UIImage imageWithCGImage:[UIImage imageWithData:data].CGImage scale:initialImage.scale orientation:self.initialImage.imageOrientation];


He experimentado este problema con imágenes tomadas de la cámara o guardadas en el rollo de la cámara que se tomaron de la cámara. Las imágenes descargadas en la biblioteca de fotos desde el navegador de safari no giran cuando se cargan.

Pude resolver este problema haciendo que los datos de la imagen fueran JPEG antes de subirlos.

let image = info[UIImagePickerControllerOriginalImage] as! UIImage let data = UIImageJPEGRepresentation(image, 1.0)

Ahora podemos usar los datos para cargar y la imagen no se rotará después de cargar.

Espero que esto funcione.


Si entiendo, ¿qué quiere hacer es ignorar la orientación de la UIImage? Si es así, entonces podrías hacer esto:

//image is your original image image = [UIImage imageWithCGImage:[image CGImage] scale:[image scale] orientation: UIImageOrientationUp];

o en Swift: -

image = UIImage(CGImage: image.CGImage!, scale: image.scale, orientation:.Up)

Resolvió mi problema de recorte ... Espero, esto es lo que estás buscando ...


Si habilita la edición, entonces la imagen editada (en lugar de la original) se orientará como se espera:

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.allowsEditing = YES; // set delegate and present controller - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *photo = [info valueForKey:UIImagePickerControllerEditedImage]; // do whatever }

Habilitar la edición permite al usuario cambiar el tamaño y mover la imagen antes de tocar "Usar foto"


Swift 3 versión basada en @ jake1981 que la tomó de @ MetalHeart2003

extension UIImage { func fixOrientation() -> UIImage { // No-op if the orientation is already correct if ( self.imageOrientation == UIImageOrientation.up ) { return self; } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform: CGAffineTransform = CGAffineTransform.identity if ( self.imageOrientation == UIImageOrientation.down || self.imageOrientation == UIImageOrientation.downMirrored ) { transform = transform.translatedBy(x: self.size.width, y: self.size.height) transform = transform.rotated(by: CGFloat(M_PI)) } if ( self.imageOrientation == UIImageOrientation.left || self.imageOrientation == UIImageOrientation.leftMirrored ) { transform = transform.translatedBy(x: self.size.width, y: 0) transform = transform.rotated(by: CGFloat(M_PI_2)) } if ( self.imageOrientation == UIImageOrientation.right || self.imageOrientation == UIImageOrientation.rightMirrored ) { transform = transform.translatedBy(x: 0, y: self.size.height); transform = transform.rotated(by: CGFloat(-M_PI_2)); } if ( self.imageOrientation == UIImageOrientation.upMirrored || self.imageOrientation == UIImageOrientation.downMirrored ) { transform = transform.translatedBy(x: self.size.width, y: 0) transform = transform.scaledBy(x: -1, y: 1) } if ( self.imageOrientation == UIImageOrientation.leftMirrored || self.imageOrientation == UIImageOrientation.rightMirrored ) { transform = transform.translatedBy(x: self.size.height, y: 0); transform = transform.scaledBy(x: -1, y: 1); } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. let ctx: CGContext = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height), bitsPerComponent: self.cgImage!.bitsPerComponent, bytesPerRow: 0, space: self.cgImage!.colorSpace!, bitmapInfo: self.cgImage!.bitmapInfo.rawValue)! ctx.concatenate(transform) if ( self.imageOrientation == UIImageOrientation.left || self.imageOrientation == UIImageOrientation.leftMirrored || self.imageOrientation == UIImageOrientation.right || self.imageOrientation == UIImageOrientation.rightMirrored ) { ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: self.size.height, height: self.size.width)) } else { ctx.draw(self.cgImage!, in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)) } // And now we just create a new UIImage from the drawing context and return it return UIImage(cgImage: ctx.makeImage()!) } }


Un UIImage tiene una propiedad imageOrientation , que instruye a UIImageView y otros consumidores de UIImage para rotar los datos de imagen en bruto. Existe una buena posibilidad de que esta bandera se esté guardando en los datos exif en la imagen jpeg cargada, pero el programa que utiliza para verla no respeta esa bandera.

Para girar el UIImage para que se muestre correctamente cuando se cargue, puede usar una categoría como esta:

UIImage + fixOrientation.h

@interface UIImage (fixOrientation) - (UIImage *)fixOrientation; @end

UIImage + fixOrientation.m

@implementation UIImage (fixOrientation) - (UIImage *)fixOrientation { // No-op if the orientation is already correct if (self.imageOrientation == UIImageOrientationUp) return self; // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. CGAffineTransform transform = CGAffineTransformIdentity; switch (self.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, self.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; case UIImageOrientationUp: case UIImageOrientationUpMirrored: break; } switch (self.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, self.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, self.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationUp: case UIImageOrientationDown: case UIImageOrientationLeft: case UIImageOrientationRight: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL, self.size.width, self.size.height, CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage), CGImageGetBitmapInfo(self.CGImage)); CGContextConcatCTM(ctx, transform); switch (self.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage); break; } // And now we just create a new UIImage from the drawing context CGImageRef cgimg = CGBitmapContextCreateImage(ctx); UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; } @end


Utilicé esta página al diseñar mi aplicación que toma fotografías y descubrí que el siguiente método corregirá la orientación y usará menos memoria y procesador que las respuestas anteriores:

CGImageRef cgRef = image.CGImage; image = [[UIImage alloc] initWithCGImage:cgRef scale:1.0 orientation:UIImageOrientationUp];

Básicamente, esto simplemente vuelve a envolver los datos de la imagen real con una nueva orientación. Estaba usando el código de @ an0, pero crea una nueva imagen en la memoria que puede afectar a una imagen de 3264x2448 que podría obtener de una cámara.


Versión Swift 4.1 de la solución de @an0 :

extension UIImage { func upOrientationImage() -> UIImage? { switch imageOrientation { case .up: return self default: UIGraphicsBeginImageContextWithOptions(size, false, scale) draw(in: CGRect(origin: .zero, size: size)) let result = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return result } } }


en rápido;)

ACTUALIZACIÓN SWIFT 3.0: D

func sFunc_imageFixOrientation(img:UIImage) -> UIImage { // No-op if the orientation is already correct if (img.imageOrientation == UIImageOrientation.up) { return img; } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform:CGAffineTransform = CGAffineTransform.identity if (img.imageOrientation == UIImageOrientation.down || img.imageOrientation == UIImageOrientation.downMirrored) { transform = transform.translatedBy(x: img.size.width, y: img.size.height) transform = transform.rotated(by: CGFloat(M_PI)) } if (img.imageOrientation == UIImageOrientation.left || img.imageOrientation == UIImageOrientation.leftMirrored) { transform = transform.translatedBy(x: img.size.width, y: 0) transform = transform.rotated(by: CGFloat(M_PI_2)) } if (img.imageOrientation == UIImageOrientation.right || img.imageOrientation == UIImageOrientation.rightMirrored) { transform = transform.translatedBy(x: 0, y: img.size.height); transform = transform.rotated(by: CGFloat(-M_PI_2)); } if (img.imageOrientation == UIImageOrientation.upMirrored || img.imageOrientation == UIImageOrientation.downMirrored) { transform = transform.translatedBy(x: img.size.width, y: 0) transform = transform.scaledBy(x: -1, y: 1) } if (img.imageOrientation == UIImageOrientation.leftMirrored || img.imageOrientation == UIImageOrientation.rightMirrored) { transform = transform.translatedBy(x: img.size.height, y: 0); transform = transform.scaledBy(x: -1, y: 1); } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. let ctx:CGContext = CGContext(data: nil, width: Int(img.size.width), height: Int(img.size.height), bitsPerComponent: img.cgImage!.bitsPerComponent, bytesPerRow: 0, space: img.cgImage!.colorSpace!, bitmapInfo: img.cgImage!.bitmapInfo.rawValue)! ctx.concatenate(transform) if (img.imageOrientation == UIImageOrientation.left || img.imageOrientation == UIImageOrientation.leftMirrored || img.imageOrientation == UIImageOrientation.right || img.imageOrientation == UIImageOrientation.rightMirrored ) { ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.height,height:img.size.width)) } else { ctx.draw(img.cgImage!, in: CGRect(x:0,y:0,width:img.size.width,height:img.size.height)) } // And now we just create a new UIImage from the drawing context let cgimg:CGImage = ctx.makeImage()! let imgEnd:UIImage = UIImage(cgImage: cgimg) return imgEnd }


Solución para Swift 3.1 para problemas de orientación al capturar la imagen de la cámara.

He actualizado la solución dada por jake y Metal Heart.

Extensión de UIImage

//MARK:- Image Orientation fix extension UIImage { func fixOrientation() -> UIImage { // No-op if the orientation is already correct if ( self.imageOrientation == UIImageOrientation.up ) { return self; } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform: CGAffineTransform = CGAffineTransform.identity if ( self.imageOrientation == UIImageOrientation.down || self.imageOrientation == UIImageOrientation.downMirrored ) { transform = transform.translatedBy(x: self.size.width, y: self.size.height) transform = transform.rotated(by: CGFloat(Double.pi)) } if ( self.imageOrientation == UIImageOrientation.left || self.imageOrientation == UIImageOrientation.leftMirrored ) { transform = transform.translatedBy(x: self.size.width, y: 0) transform = transform.rotated(by: CGFloat(Double.pi / 2.0)) } if ( self.imageOrientation == UIImageOrientation.right || self.imageOrientation == UIImageOrientation.rightMirrored ) { transform = transform.translatedBy(x: 0, y: self.size.height); transform = transform.rotated(by: CGFloat(-Double.pi / 2.0)); } if ( self.imageOrientation == UIImageOrientation.upMirrored || self.imageOrientation == UIImageOrientation.downMirrored ) { transform = transform.translatedBy(x: self.size.width, y: 0) transform = transform.scaledBy(x: -1, y: 1) } if ( self.imageOrientation == UIImageOrientation.leftMirrored || self.imageOrientation == UIImageOrientation.rightMirrored ) { transform = transform.translatedBy(x: self.size.height, y: 0); transform = transform.scaledBy(x: -1, y: 1); } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. let ctx: CGContext = CGContext(data: nil, width: Int(self.size.width), height: Int(self.size.height), bitsPerComponent: self.cgImage!.bitsPerComponent, bytesPerRow: 0, space: self.cgImage!.colorSpace!, bitmapInfo: self.cgImage!.bitmapInfo.rawValue)!; ctx.concatenate(transform) if ( self.imageOrientation == UIImageOrientation.left || self.imageOrientation == UIImageOrientation.leftMirrored || self.imageOrientation == UIImageOrientation.right || self.imageOrientation == UIImageOrientation.rightMirrored ) { ctx.draw(self.cgImage!, in: CGRect(x: 0,y: 0,width: self.size.height,height: self.size.width)) } else { ctx.draw(self.cgImage!, in: CGRect(x: 0,y: 0,width: self.size.width,height: self.size.height)) } // And now we just create a new UIImage from the drawing context and return it return UIImage(cgImage: ctx.makeImage()!) } }

Swift 2.0

//MARK:- Image Orientation fix extension UIImage { func fixOrientation() -> UIImage { // No-op if the orientation is already correct if ( self.imageOrientation == UIImageOrientation.Up ) { return self; } // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. var transform: CGAffineTransform = CGAffineTransformIdentity if ( self.imageOrientation == UIImageOrientation.Down || self.imageOrientation == UIImageOrientation.DownMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.width, self.size.height) transform = CGAffineTransformRotate(transform, CGFloat(M_PI)) } if ( self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.width, 0) transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2)) } if ( self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored ) { transform = CGAffineTransformTranslate(transform, 0, self.size.height); transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2)); } if ( self.imageOrientation == UIImageOrientation.UpMirrored || self.imageOrientation == UIImageOrientation.DownMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.width, 0) transform = CGAffineTransformScale(transform, -1, 1) } if ( self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.RightMirrored ) { transform = CGAffineTransformTranslate(transform, self.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. let ctx: CGContextRef = CGBitmapContextCreate(nil, Int(self.size.width), Int(self.size.height), CGImageGetBitsPerComponent(self.CGImage), 0, CGImageGetColorSpace(self.CGImage), CGImageGetBitmapInfo(self.CGImage).rawValue)!; CGContextConcatCTM(ctx, transform) if ( self.imageOrientation == UIImageOrientation.Left || self.imageOrientation == UIImageOrientation.LeftMirrored || self.imageOrientation == UIImageOrientation.Right || self.imageOrientation == UIImageOrientation.RightMirrored ) { CGContextDrawImage(ctx, CGRectMake(0,0,self.size.height,self.size.width), self.CGImage) } else { CGContextDrawImage(ctx, CGRectMake(0,0,self.size.width,self.size.height), self.CGImage) } // And now we just create a new UIImage from the drawing context and return it return UIImage(CGImage: CGBitmapContextCreateImage(ctx)!) } }

Uso de esta extensión UIImage en su código:

vamos a fixOrientationImage = chosenImage.fixOrientation ()

Coloque esto en sus métodos de selección de imágenes de delegado como este

Swift 3.1

//MARK: Image Picker Delegates func imagePickerController( _ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]){ let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage profileImg.contentMode = .scaleAspectFill let fixOrientationImage=chosenImage.fixOrientation() profileImg.image = fixOrientationImage dismiss(animated: true, completion: nil) }

Swift 2.0

//MARK: Image Picker Delegates func imagePickerController( picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage profileImg.contentMode = .ScaleAspectFill **//Fix the image orientation** let fixOrientationImage=chosenImage.fixOrientation() profileImg.image = fixOrientationImage dismissViewControllerAnimated(true, completion: nil) }