Au cours des dernières semaines, j'ai travaillé avec des images en objective-c et j'ai remarqué beaucoup 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 le MMS vers moi) sont pivotées de 90 degrés. Je ne savais pas pourquoi dans le monde cela se produisait (d'où ma question ) mais j'ai pu trouver un travail bon marché.
Ma question cette fois est pourquoi cela se produit-il ? Pourquoi Apple fait-il pivoter les images? Lorsque je prends une photo avec mon appareil photo à l'endroit, à moins d'exécuter le code mentionné ci-dessus, lorsque j'enregistre la photo, elle est enregistrée en rotation. Maintenant, ma solution de contournement était correcte jusqu'à il y a quelques jours.
Mon application modifie les pixels individuels d'une image, en particulier le canal alpha d'un PNG (ainsi toute conversion JPEG est jetée hors de la fenêtre 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. Alors 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'il faut la faire pivoter)! Je ne peux pas comprendre comment faire pivoter l'image en mémoire - idéalement, je préférerais simplement effacer ce imageOrientation
drapeau tous ensemble.
Voici quelque chose d'autre qui m'a également déconcerté ... Lorsque je prends la photo, le imageOrientation
est réglé sur 3. Mon code de contournement est assez intelligent pour réaliser cela et le retourner afin que l'utilisateur ne le remarque jamais. De plus, mon code pour enregistrer l'image dans la bibliothèque le réalise, le retourne, puis l' enregistre pour qu'il apparaisse correctement dans la pellicule.
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 enregistrée dans mon application, la valeur imageOrientation
est 0 - exactement ce que je veux voir, et ma solution de contournement de rotation n'a même pas besoin de s'exécuter (remarque: lors du chargement d'images depuis Internet par opposition aux images prises avec un appareil photo , la imageOrientation
vaut toujours 0, ce qui donne un comportement parfait). Pour une raison quelconque, mon code de sauvegarde semble effacer cet imageOrientation
indicateur. 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. Fait UIImageWriteToSavedPhotosAlbum
quelque chose de spécial avec imageOrientation
?
La meilleure solution à ce problème serait-elle de simplement souffler imageOrientation
dès que l'utilisateur a terminé de prendre une image. Je suppose qu'Apple a fait le comportement de rotation pour une raison, non? Quelques personnes ont suggéré qu'il s'agissait d'un défaut Apple.
(... si vous n'êtes pas encore perdu ... Note 2: Quand je prends une photo horizontale, tout semble fonctionner parfaitement, tout comme les photos prises sur Internet)
ÉDITER:
Voici à quoi ressemblent réellement certaines images et scénarios. Sur la base des commentaires jusqu'à présent, il semble que ce comportement étrange est plus qu'un simple comportement d'iPhone, ce que je pense être bon.
Ceci est une photo de la photo que j'ai prise avec mon téléphone (notez l'orientation correcte), elle apparaît exactement comme elle le faisait sur mon téléphone lorsque j'ai pris la photo:
Voici à quoi ressemble l'image dans Gmail une fois que je l'ai envoyée par courrier électronique (on dirait que Gmail la gère correctement):
Voici à quoi ressemble l'image sous forme de vignette dans les fenêtres (ne semble pas être gérée correctement):
Et voici à quoi ressemble l'image réelle lorsqu'elle est ouverte avec la visionneuse de photos Windows (toujours pas géré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 doit être tourné de 90 degrés". Ces informations figureraient dans les données EXIF. (Pourquoi il doit être tourné de 90 degrés, plutôt que de passer par défaut à la verticale droite, je ne sais pas). À partir de là, Gmail est suffisamment intelligent pour lire et analyser ces données EXIF et les afficher correctement. Cependant, Windows n'est pas assez intelligent pour lire les données EXIF et affiche donc l'image de manière incorrecte . Mes hypothèses sont-elles correctes?