2012-01-12 10 views
15

Actualmente tengo una aplicación que usa ALAsssetsLibrary para buscar las fotos. He colocado la foto en una vista de imagen y puedo subirla al servidor. Cuando probé en el dispositivo real después de tomar algunas fotos, descubrí que las fotos que se suponía que se tomarían en Portrait se convirtieron en un paisaje.La orientación no se comporta correctamente con Photo en ALAsset

Por lo tanto, llamé función diferente para obtener el CGImage así:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage] scale:1.0 orientation:(UIImageOrientation)[representation orientation]]; 

El primer probado, he usado esto:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage]] 

pensé que la una con la escala y la orientación podría dar me la orientación correcta de que la foto fue tomada. Pero no me dio la solución correcta.

¿Extraño algo que sea necesario para generar una orientación correcta de la foto?

+1

este problema se produce con las fotos tomadas desde el dispositivo – Leena

Respuesta

44

El manejo correcto de la orientación depende de la versión de iOS que esté utilizando. En iOS4 e iOS 5, la miniatura ya está rotada correctamente, por lo que puede inicializar su UIImage sin especificar ningún parámetro de rotación. Sin embargo, para la imagen de pantalla completa, el comportamiento es diferente para cada versión de iOS. En iOS 5, la imagen ya está rotada en iOS 4 no.

Así que en iOS4 que puedes usar:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
                scale:[defaultRep scale] orientation:(UIImageOrientation)[defaultRep orientation]]; 

En IOS5 el siguiente código debería funcionar correctamente:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] scale:[defaultRep scale] orientation:0]; 

Cheers,

Hendrik

+0

En mi caso, necesitaba la resoluciónResolutionImage completa y he probado en iOS 6 y 7. La imagen no se giró automáticamente, pero el primer código de ejemplo funciona. ¡Gracias, amigo! P.S. sea ​​cuidadoso si guarda la imagen en un archivo con metadatos. Si ha girado la imagen, debe establecer la orientación EXIF ​​en 0 para evitar jpegs extraños girados;) – Primoz990

+0

Debo corregir mi comentario. El primer ejemplo de código no giró mi imagen FullResolution, tuve que rotarla solo. Pero acepta que la imagen de pantalla completa se gira automáticamente en iOS 6 y 7. – Primoz990

+0

¡Genial! ¡Funciona para mí también con iOS 7! Muchas gracias ! – Vinestro

4

probar este código: -

UIImage* img = [UIImage imageWithCGImage:asset.thumbnail]; 
img = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation:UIImageOrientationUp]; 

Esto puede ayudarle.

+0

No puedo probarlo ahora ya que no tengo el dispositivo. ¿Te importaría explicarme esas dos líneas de código? La img en la primera línea es la miniatura del activo, pero no la imagen real. – LittleFunny

+0

he utilizado la miniatura de la imagen y he mantenido la orientación de la imagen hacia arriba para que no se roten funcionó en mi caso. – Leena

+0

Quizás tengo un problema diferente ... Pero gracias por tu ayuda – LittleFunny

3

Mi experiencia se limita a IOS 5.x pero puedo decirte que las imágenes en miniatura y a pantalla completa están orientadas pro perly. Es la imagen de resolución completa que es horizontal cuando se dispara verticalmente. Mi solución es utilizar una categoría en UIImage que obtuve de aquí:

http://www.catamount.com/forums/viewtopic.php?f=21&t=967&start=0

Proporciona un buen método que gira en un UIImage así:

 UIImage *tmp = [UIImage imageWithCGImage:startingFullResolutionImage]; 
     startingFullResolutionImage = [[tmp imageRotatedByDegrees:-90.0f] CGImage]; 
+0

Acabo de utilizar fullresolutionimage y funcionó para mí. Gracias. – Ali

0

Para fullResolutionImage, me gustaría para proporcionar una solución de la siguiente manera,

ALAssetRepresentation *rep = [asset defaultRepresentation]; 

// First, write orientation to UIImage, i.e., EXIF message. 
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:rep.scale orientation:(UIImageOrientation)rep.orientation]; 
// Second, fix orientation, and drop out EXIF 
if (image.imageOrientation != UIImageOrientationUp) { 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
    [image drawInRect:(CGRect){0, 0, image.size}]; 
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    image = normalizedImage; 
} 
// Third, compression 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

imageData es lo que desea, y simplemente subirlo a su servidor de fotografías.

Por cierto, si crees que EXIF ​​es útil, puedes complementarlo al normalizedImage como desees.

Cuestiones relacionadas