4 votes

Implémentation de la rotation automatique des images JPEG selon l'orientation EXIF dans le plugin ImageIO

Contexte

Je travaille depuis un certain temps sur un plugin ImageIO pour la lecture des JPEGs. Une des fonctionnalités que j'aimerais implémenter, est la rotation automatique de l'image, en fonction de la balise EXIF/TIFF Orientation, si elle est présente.

Je ne demande pas comment mettre en œuvre la rotation elle-même, mon problème concerne plutôt l'API ImageReader. Pour de nombreux utilisateurs, le simple fait d'appeler ImageIO.read(myJPEG) C'est tout ce qu'ils font, et je pense qu'ils sont satisfaits de la rotation de l'image dans la bonne orientation. Cependant, si vous regardez le ImageReader API Il dispose de nombreuses méthodes pour obtenir des informations et des métadonnées sur l'image, ainsi que de plusieurs moyens pour lire les données des pixels.

La ou les questions

Devrais-je exposer un moyen de lire les données telles qu'elles sont dans le fichier, en utilisant la fonction ImageReadParam (Je pourrais aussi le faire dans l'autre sens, mais cela ne permettrait pas au cas commun mentionné ci-dessus de bénéficier de la fonctionnalité) ?

Je travaille sur le support des métadonnées (comme dans IIOMetadata ), les métadonnées doivent-elles signaler la balise d'orientation telle qu'elle est écrite dans le fichier, ou être mises à jour pour refléter la rotation de l'image ? C'est là que je sens que les choses se dégradent... La vraie question ici est de savoir ce qui se passe lorsque quelqu'un lit l'image et les métadonnées, fait quelques manipulations sur l'image et la stocke à nouveau avec les métadonnées (est-ce que le rédacteur doit alors faire la rotation inverse, ou bien supprimer "comme par magie" la balise d'orientation et la mettre à jour) ?

... ou bien, en option, devrais-je simplement abandonner et laisser aux clients le soin de lire les métadonnées EXIF et d'appliquer eux-mêmes la rotation si nécessaire ?

Les contributions et les suggestions des responsables de la mise en œuvre ainsi que des utilisateurs d'ImageIO sont les bienvenues ! :-)

5voto

TomWolk Points 128

Raisons pour lesquelles il ne faut pas faire pivoter l'image

  • L'orientation est stockée dans les métadonnées Exif, ce qui ne fait pas partie de la norme JPEG/JFIF.
  • La lecture des métadonnées Exif ajoute une complexité supplémentaire
  • Vous pouvez vous tromper si les métadonnées Exif sont fausses.
  • Vous devez modifier les métadonnées Exif si vous les incluez dans le fichier modifié.
  • La rotation de l'image peut être coûteuse en termes de charge de processeur et de mémoire.
  • Comportement indéfini si vous lisez les tuiles

Raisons pour lesquelles il faut faire pivoter l'image

  • Les métadonnées Exif sont écrites par presque tous les appareils photo numériques fabriqués après 2010.
  • La plupart des appareils photo numériques ne font pas pivoter l'image mais enregistrent uniquement l'orientation dans les métadonnées. Probablement parce qu'un matériel supplémentaire serait nécessaire.
  • Pour ces deux dernières raisons, l'orientation Exif peut être considérée comme une norme et un élément d'information qui doit être respecté.
  • De nombreux visionneurs destinés aux utilisateurs non techniques, comme les navigateurs web, font pivoter l'image en fonction de la norme Exif afin d'offrir une meilleure expérience utilisateur. Par conséquent, les utilisateurs considéreront qu'une vue qui n'effectue pas de rotation est incomplète ou cassée.
  • D'autres informations de métadonnées, comme la conversion des couleurs, sont également appliquées pendant la lecture.

Je pense qu'ImageIO devrait faire tourner l'image et mettre à jour l'Exif. De cette façon, le développeur peut travailler avec ImageIO sans se soucier du format du fichier image. Et le comportement du nouveau JPEGReader est compatible avec l'ancien.

Les caractéristiques supplémentaires seraient

  • pour fournir une méthode pour lire l'image sans rotation et laisser l'exif intact.
  • pour fournir une méthode permettant d'écrire l'image avec une orientation spécifiée.
  • Je ne ferais pas en sorte que l'écriture JPEG change son comportement en fonction des métadonnées Exif, car il peut y avoir beaucoup de choses dans les Exif.

Je pense que nous devrions laisser le passé derrière nous (Exif n'étant pas un standard) et considérer l'orientation dans Exif comme faisant partie du JPEG. Mais je pense que nous devrions toujours ignorer toutes les autres informations Exif lorsque nous mettons des pixels en mémoire ou sur l'écran ;-)

4voto

SteveT Points 111

Étant donné que tous les lecteurs d'images dans le monde retournent automatiquement l'image correctement, je parie que pratiquement tout le monde serait d'accord pour que cela se produise automatiquement. Dans un sens, l'image "est" la version retournée, même si la partie bitmap du fichier image dit le contraire. L'ensemble du fichier est la norme.

Et oui, je serais très heureux si ImageIO.read() pouvait juste, hum, travail . Cela devrait me donner une image telle qu'elle serait affichée par tous les visionneurs connus de la planète. Bien sûr, il est possible d'inclure des API pour obtenir une image brute si quelqu'un le souhaite vraiment, mais le comportement par défaut doit correspondre au modèle d'utilisation le plus courant et à la manière la plus logique. Pourquoi auriez-vous besoin de le visualiser dans une mauvaise orientation ? Il peut y avoir des cas d'utilisation bizarres, mais je parie qu'ils sont très rares par rapport au cas normal.

Savez-vous quand ils vont corriger ce problème dans le JDK par défaut ? J'écris mon propre code pour effectuer ma propre rotation afin de placer l'image. dos se sentait malade et mal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X