voltear voltea rotar rotacion porque pantalla modo las girar frontal fotos espejo efecto desactivar como camara iphone objective-c ios png exif

iphone - voltea - Imagen de iOS PNG girada 90 grados



rotar pantalla iphone 7 (6)

Aquí hay una forma más de lograr eso:

@IBAction func rightRotateAction(sender: AnyObject) { let imgToRotate = CIImage(CGImage: sourceImageView.image?.CGImage) let transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2)) let rotatedImage = imgToRotate.imageByApplyingTransform(transform) let extent = rotatedImage.extent() let contex = CIContext(options: [kCIContextUseSoftwareRenderer: false]) let cgImage = contex.createCGImage(rotatedImage, fromRect: extent) adjustedImage = UIImage(CGImage: cgImage)! UIView.transitionWithView(sourceImageView, duration: 0.5, options: UIViewAnimationOptions.TransitionCrossDissolve, animations: { self.sourceImageView.image = self.adjustedImage }, completion: nil) }

En mi aplicación de iOS que estoy escribiendo, trato con PNG porque trato con el canal alfa. Por alguna razón, puedo cargar un PNG en mi imageView muy bien, pero cuando llega el momento de copiar la imagen fuera de mi aplicación (en el PasteBoard) o guardar la imagen en mi cámara, la imagen gira 90 grados.

He buscado en todas partes sobre esto, y una de las cosas que aprendí es que si utilizara archivos JPEG, no tendría este problema (parece) debido a la información EXIF.

Mi aplicación tiene funcionalidad completa de copiar / pegar, y aquí está el truco (lo escribiré en pasos para que sea más fácil de seguir):

  1. Ve a mi rollo de cámara y copia una imagen
  2. Ve a mi aplicación y presiona "Pegar", la imagen se pega bien, y puedo hacerlo todo el día
  3. Haga clic en la función de copia que implementé, y luego haga clic en "Pegar", y la imagen se pega, pero se gira.

Estoy 100% seguro de que mi código de copiar y pegar no es lo que está mal aquí, porque si vuelvo al paso 2 anterior y hago clic en "guardar", la foto se guarda en mi biblioteca, pero se gira 90 grados.

Lo que es aún más extraño es que parece funcionar bien con las imágenes descargadas de Internet, pero es muy impredecible con las imágenes que tomé manualmente con el teléfono. Algunos funcionan, otros no ...

¿Alguien tiene alguna idea sobre esto? ¿Alguna solución posible que puedo usar? Estoy bastante seguro de que el código funciona para aproximadamente el 75% de mis imágenes. Puedo publicar el código a petición, sin embargo.


Este comportamiento de "rotación extraña" realmente no es tan extraño en absoluto. Es inteligente, y por inteligente me refiero a la memoria eficiente. Cuando gira un dispositivo iOS, el hardware de la cámara gira con él. Cuando toma una fotografía, esa imagen se capturará, sin embargo, la cámara estará orientada. El UIImage puede usar esta información de imagen en bruto sin copiar solo manteniendo un registro de la orientación en la que debería estar. Cuando usas UIImagePNGRepresentation() pierdes estos datos de orientación y obtienes un PNG de la imagen subyacente tal como fue tomada por la cámara . Para solucionar esto, en lugar de rotar puedes decirle a la imagen original que se dibuje a sí misma en un nuevo contexto y obtener el UIImage correctamente orientado de ese contexto.

UIImage *image = ...; //Have the image draw itself in the correct orientation if necessary if(!(image.imageOrientation == UIImageOrientationUp || image.imageOrientation == UIImageOrientationUpMirrored)) { CGSize imgsize = image.size; UIGraphicsBeginImageContext(imgsize); [image drawInRect:CGRectMake(0.0, 0.0, imgsize.width, imgsize.height)]; image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); } NSData *png = UIImagePNGRepresentation(image);


Para aquellos que quieren una solución Swift, crea una extensión de UIImage y agrega el siguiente método:

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


Puede usar Image I / O para guardar una imagen PNG en un archivo (o NSMutableData ) con respecto a la orientación de la imagen. En el siguiente ejemplo, guardo la imagen PNG en un archivo en la path .

- (BOOL)savePngFile:(UIImage *)image toPath:(NSString *)path { NSData *data = UIImagePNGRepresentation(image); int exifOrientation = [UIImage cc_iOSOrientationToExifOrientation:image.imageOrientation]; NSDictionary *metadata = @{(__bridge id)kCGImagePropertyOrientation:@(exifOrientation)}; NSURL *url = [NSURL fileURLWithPath:path]; CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); if (!source) { return NO; } CFStringRef UTI = CGImageSourceGetType(source); CGImageDestinationRef destination = CGImageDestinationCreateWithURL((__bridge CFURLRef)url, UTI, 1, NULL); if (!destination) { CFRelease(source); return NO; } CGImageDestinationAddImageFromSource(destination, source, 0, (__bridge CFDictionaryRef)metadata); BOOL success = CGImageDestinationFinalize(destination); CFRelease(destination); CFRelease(source); return success; }

cc_iOSOrientationToExifOrientation: es un método de la categoría UIImage .

+ (int)cc_iOSOrientationToExifOrientation:(UIImageOrientation)iOSOrientation { int exifOrientation = -1; switch (iOSOrientation) { case UIImageOrientationUp: exifOrientation = 1; break; case UIImageOrientationDown: exifOrientation = 3; break; case UIImageOrientationLeft: exifOrientation = 8; break; case UIImageOrientationRight: exifOrientation = 6; break; case UIImageOrientationUpMirrored: exifOrientation = 2; break; case UIImageOrientationDownMirrored: exifOrientation = 4; break; case UIImageOrientationLeftMirrored: exifOrientation = 5; break; case UIImageOrientationRightMirrored: exifOrientation = 7; break; default: exifOrientation = -1; } return exifOrientation; }

Alternativamente, puede guardar la imagen en NSData utilizando CGImageDestinationCreateWithData y pasar NSMutableData lugar de NSURL en CGImageDestinationCreateWithURL .


Si tiene problemas debido a la propiedad image imageOrientation existente, puede construir una imagen por lo demás idéntica con una orientación diferente como esta:

CGImageRef imageRef = [sourceImage CGImage]; UIImage *rotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];

Es posible que deba experimentar con qué orientación establecer en las imágenes de reemplazo, posiblemente cambiando según la orientación con la que comenzó.

También controle el uso de su memoria. Las aplicaciones de fotografía a menudo se agotan, y esto duplicará su almacenamiento por imagen, hasta que libere la imagen de origen.


Tomó unos días, pero finalmente lo descubrí gracias a la respuesta @Dondragmer publicada. Pero pensé que publicaría mi solución completa.

Así que, básicamente, tuve que escribir un método para rotar mis imágenes de forma inteligente y automática. La desventaja es que tengo que llamar a este método en todas partes a lo largo de mi código y es una especie de procesador intensivo, especialmente cuando se trabaja en dispositivos móviles, pero el lado positivo es que puedo tomar imágenes, copiar imágenes, pegar imágenes y guardar imágenes y todos giran apropiadamente. Este es el código que terminé usando (el método aún no está completo al 100%, aún necesita editar fugas de memoria y otras).

Terminé aprendiendo que la primera vez que se insertaba una imagen en mi aplicación (ya sea porque un usuario presiona "tomar imagen", "pegar imagen" o "seleccionar imagen", por alguna razón se inserta perfectamente sin auto En este punto, imageOrientationWhenAddedToScreen el valor de rotación en una variable global llamada imageOrientationWhenAddedToScreen . Esto me facilitó la vida porque cuando llegó el momento de manipular la imagen y guardarla fuera del programa, simplemente revisé esta variable global en caché y determiné si necesitaba rotar apropiadamente la imagen.

- (UIImage*) rotateImageAppropriately:(UIImage*) imageToRotate { //This method will properly rotate our image, we need to make sure that //We call this method everywhere pretty much... CGImageRef imageRef = [imageToRotate CGImage]; UIImage* properlyRotatedImage; if (imageOrientationWhenAddedToScreen == 0) { //Don''t rotate the image properlyRotatedImage = imageToRotate; } else if (imageOrientationWhenAddedToScreen == 3) { //We need to rotate the image back to a 3 properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:3]; } else if (imageOrientationWhenAddedToScreen == 1) { //We need to rotate the image back to a 1 properlyRotatedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:1]; } return properlyRotatedImage; }

Todavía no estoy 100% seguro de por qué Apple tiene este extraño comportamiento de rotación de imágenes (prueba esto ... Toma tu teléfono y ponlo boca abajo y toma una foto, notarás que la imagen final sale del revés, tal vez esto ¿Por qué Apple tiene este tipo de funcionalidad?).

Sé que pasé una gran cantidad de tiempo averiguando esto, ¡así que espero que ayude a otras personas!