Ces dernières semaines, j'ai travaillé avec des images en Objective-C et j'ai remarqué un certain nombre de comportements étranges. Tout d'abord, comme beaucoup d'autres personnes, j'ai eu ce problème où les images prises avec l'appareil photo (ou prises avec l'appareil photo de quelqu'un d'autre et envoyées par MMS) sont tournées de 90 degrés. Je n'étais pas sûr de la raison pour laquelle cela se produisait (d'où le fait que je n'ai pas pu m'en rendre compte). ma question ) mais j'ai pu trouver une solution bon marché.
Ma question cette fois-ci est pourquoi cela se produit-il ? ? Pourquoi Apple fait-elle tourner les images ? Lorsque je prends une photo avec mon appareil photo à l'endroit, à moins que je n'exécute le code mentionné ci-dessus, lorsque je sauvegarde la photo, elle est enregistrée avec une rotation. Ma solution de contournement fonctionnait bien jusqu'à il y a quelques jours.
Mon application modifie les pixels individuels d'une image, en particulier le canal alpha d'un PNG (toute conversion JPEG est donc exclue pour mon scénario). Il y a quelques jours, j'ai remarqué que même si l'image s'affiche correctement dans mon application grâce à mon code de contournement, lorsque mon algorithme modifie les pixels individuels de l'image, il pense que l'image est tournée. Ainsi, au lieu de modifier les pixels en haut de l'image, il modifie les pixels sur le côté de l'image (car il pense qu'elle doit être tournée) ! Je n'arrive pas à trouver comment faire pivoter l'image en mémoire - idéalement, je préférerais simplement effacer cette image de la mémoire. imageOrientation
drapeau tous ensemble.
Il y a autre chose qui m'a aussi dérouté... Quand je prends la photo, le imageOrientation
Mon code de contournement est suffisamment intelligent pour s'en rendre compte et l'inverser afin que l'utilisateur ne le remarque jamais. De plus, mon code pour enregistrer l'image dans la bibliothèque s'en rend compte et l'inverse, puis l'enregistre pour qu'il apparaisse correctement dans le rouleau de l'appareil photo.
Ce code ressemble à ceci :
NSData* pngdata = UIImagePNGRepresentation (self.workingImage); //PNG wrap
UIImage* img = [self rotateImageAppropriately:[UIImage imageWithData:pngdata]];
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
Lorsque je charge cette image nouvellement sauvegardée dans mon application, la fonction imageOrientation
est 0 - exactement ce que je veux voir, et ma solution de contournement de la rotation n'a même pas besoin d'être exécutée (note : lors du chargement d'images à partir d'Internet par opposition à des images prises avec un appareil photo, la fonction imageOrientation
est toujours 0, ce qui donne un comportement parfait). Pour une raison ou une autre, mon code de sauvegarde semble effacer ceci imageOrientation
le drapeau. J'espérais simplement voler ce code et l'utiliser pour effacer mon imageOrientation dès que l'utilisateur prend une photo et l'ajoute à l'application, mais cela ne semble pas fonctionner. Est-ce que UIImageWriteToSavedPhotosAlbum
faire quelque chose de spécial avec imageOrientation
?
Est-ce que la meilleure solution à ce problème serait de simplement souffler imageOrientation
dès que l'utilisateur a fini de prendre une photo. Je suppose qu'Apple a fait ce comportement de rotation pour une raison, n'est-ce pas ? Quelques personnes ont suggéré que c'était un défaut d'Apple.
(... si vous n'êtes pas encore perdu...) Note2 : Lorsque je prends une photo horizontale, tout semble fonctionner parfaitement, tout comme les photos prises sur Internet)
EDITAR:
Voici à quoi ressemblent certaines des images et des scénarios. D'après les commentaires reçus jusqu'à présent, il semble que ce comportement étrange soit plus qu'un simple comportement de l'iPhone, ce qui est une bonne chose.
Voici une image de la photo que j'ai prise avec mon téléphone (notez la bonne orientation), elle apparaît exactement comme elle était sur mon téléphone lorsque j'ai pris la photo :
Voici à quoi ressemble l'image dans Gmail après que je me la sois envoyée par courriel (on dirait que Gmail la traite correctement) :
Voici à quoi ressemble l'image en tant que vignette dans Windows (on dirait qu'elle n'est pas traitée correctement) :
Et voici à quoi ressemble l'image réelle lorsqu'elle est ouverte avec Windows Photo Viewer (toujours pas traitée correctement) :
Après tous les commentaires sur cette question, voici ce que je pense... L'iPhone prend une image, et dit "pour l'afficher correctement, il faut la faire pivoter de 90 degrés". Cette information serait dans les données EXIF. (Je ne sais pas pourquoi il faut la faire pivoter de 90 degrés, plutôt que de la mettre à la verticale par défaut). À partir de là, Gmail est suffisamment intelligent pour lire et analyser ces données EXIF, et les afficher correctement. Windows, en revanche, n'est pas assez intelligent pour lire les données EXIF et affiche donc l'image. incorrectement . Mes hypothèses sont-elles correctes ?
0 votes
Intéressant... si c'est vrai, pourquoi les images prises sont-elles réglées sur un angle droit ? Je sais que ce n'est pas un défaut de l'iPhone, car j'ai remarqué un comportement similaire lorsqu'un ami (avec un BlackBerry) prend une photo et me l'envoie par MMS.
0 votes
Vous voyez que votre appareil photo écrit des métadonnées pour le faire pivoter à 90 degrés, certains OS lisent ces métadonnées et d'autres non.
0 votes
Très bonne lecture (voir la réponse de @Hadley ci-dessous - elle était auparavant dans un commentaire). Donc mon application doit clairement être assez intelligente pour gérer les images qui contiennent des données EXIF, ainsi que les images qui n'en contiennent pas... Je ne comprends toujours pas pourquoi lorsque je prends une photo à l'endroit, le drapeau d'orientation dit qu'elle doit être tournée de 90 degrés ?
0 votes
Si vous réglez le mode photo sur Portrait et que vous ne faites pas pivoter votre appareil photo à angle droit ou si vous réglez le mode Paysage et que l'appareil photo a capturé l'image à angle droit, le capteur règle automatiquement l'orientation sur la bonne position. Vérifiez-le
1 votes
La solution est probablement que votre application doit lire les méta-données et faire pivoter l'image et/ou modifier les méta-données selon les besoins.
0 votes
Regardez mon édition. J'ai ajouté des images pour montrer exactement ce que je vois. Est-ce que mon hypothèse est correcte, à savoir que le comportement est tout à fait voulu, c'est juste à l'application finale de déterminer comment afficher l'image ?
0 votes
Je vois que cela devient un énorme problème pour moi en ce moment. J'ai créé un site web en utilisant WooCommerce. L'ajout d'articles sur le marché via un ipad (en prenant des photos sur l'ipad) fait que les images s'affichent dans la boutique avec une rotation de 90 degrés vers la gauche, alors qu'elles s'affichent très bien sur un appareil mobile.