La orientación de la imagen de iOS tiene un extraño comportamiento

Durante las últimas semanas he estado trabajando con imágenes en object-c y he notado muchos comportamientos extraños. Primero, como muchas otras personas, he tenido este problema donde las imágenes tomadas con la cámara (o tomadas con la cámara de otra persona y MMS'd para mí) se rotan 90 grados. No estaba seguro de por qué sucedía esto en el mundomi pregunta) pero pude encontrar un trabajo barato.

Mi pregunta esta vez esPor qué está pasando esto? ¿Por qué Apple está rotando imágenes? Cuando tomo una foto con mi cámara boca arriba, a menos que realice el código mencionado anteriormente, cuando guardo la foto, ésta se guarda girada. Ahora, mi solución estaba bien hasta hace unos días.

Mi aplicación modifica los píxeles individuales de una imagen, específicamente el canal alfa de un PNG (por lo que cualquier conversión de JPEG se arroja por la ventana para mi escenario). Hace unos días, noté que aunque la imagen se muestra correctamente en mi aplicación gracias a mi código de solución, cuando mi algoritmo modifica los píxeles individuales de la imagen, piensa que la imagen está girada. ¡Así que en lugar de modificar los píxeles en la parte superior de la imagen, modifica los píxeles en el lado de la imagen (porque piensa que debería girarse)! No puedo imaginar cómo rotar la imagen en la memoria, idealmente preferiría simplemente borrar esoimageOrientation bandera todos juntos.

Aquí hay algo más que me ha desconcertado también ... Cuando tomo la foto, elimageOrientation está establecido en 3. Mi código de solución es lo suficientemente inteligente como para darse cuenta de esto y voltearlo para que el usuario nunca lo note. Además, mi código para guardar la imagen en la biblioteca se da cuenta de esto, lo voltea,entonces Lo guarda para que aparezca en el rollo de la cámara correctamente.

Ese código se ve así:

NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap 
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];   
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);

Cuando cargo esta imagen recién guardada en mi aplicación, laimageOrientation es 0: exactamente lo que quiero ver, y mi solución de rotación ni siquiera necesita ejecutarse (nota: cuando se cargan imágenes de Internet en lugar de imágenes tomadas con una cámara, elimageOrientation siempre es 0, resultando en un comportamiento perfecto). Por alguna razón, mi código de guardar parece borrar estoimageOrientation bandera. Esperaba simplemente robar ese código y usarlo para borrar mi Imagen Orientación tan pronto como el usuario toma una foto y la agrega a la aplicación, pero parece que no funciona. HaceUIImageWriteToSavedPhotosAlbum hacer algo especial conimageOrientation?

¿Sería la mejor solución para este problema simplemente volar?imageOrientation Tan pronto como el usuario termine de tomar una imagen. Supongo que Apple tiene el comportamiento de rotación hecho por una razón, ¿verdad? Algunas personas sugirieron que esto es un defecto de Apple.

(... si aún no estás perdido ... Nota2: cuando tomo una foto horizontal, todo parece funcionar perfectamente, al igual que las fotos tomadas de Internet)

EDITAR:

Aquí están cómo se ven algunas de las imágenes y los escenarios. Basado en los comentarios hasta ahora, parece que este extraño comportamiento es más que solo un comportamiento del iPhone, que creo que es bueno.

Esta es una foto de la foto que tomé con mi teléfono (tenga en cuenta la orientación correcta), aparece exactamente como lo hizo en mi teléfono cuando tomé la foto:

Así es como se ve la imagen en Gmail después de que me la envié por correo electrónico (parece que Gmail lo maneja correctamente):

Aquí es cómo se ve la imagen como una miniatura en Windows (no parece que se maneje correctamente):

Y aquí es cómo se ve la imagen real cuando se abre con Windows Photo Viewer (aún no se maneja correctamente):

Después de todos los comentarios sobre esta pregunta, esto es lo que estoy pensando ... El iPhone toma una imagen y dice "para mostrar esto correctamente, debe girarse 90 grados". Esta información estaría en los datos EXIF. (No sé por qué es necesario girarlo 90 grados, en lugar de usar la configuración vertical recta). Desde aquí, Gmail es lo suficientemente inteligente como para leer y analizar los datos EXIF ​​y mostrarlos correctamente. Sin embargo, Windows no es lo suficientemente inteligente como para leer los datos EXIF ​​y, por lo tanto, muestra la imagenincorrectamente. ¿Son mis suposiciones correctas?

Respuestas a la pregunta(12)

Su respuesta a la pregunta