Question

Salutations,

Je vais obtenir des informations exif à partir d'images utilisant Android. Je sais qu'il existe des librairies Java standard que je pourrais utiliser avec cet appareil. Je suis sûr que je vais en utiliser un.

Mais entre-temps, quelqu'un peut-il m'expliquer comment cette information est codée à l'intérieur d'un fichier JPG? Où / comment obtenez-vous habituellement les informations du document. Quand j'ouvre, il documente avec un éditeur de texte, c'est tout binaire.

Curieux de savoir comment cela fonctionne et comment je pourrais potentiellement lire les données en question.

Était-ce utile?

La solution

Si vous recherchez la chaîne " Exif " vous trouverez le début des données Exif - c'est assez compliqué, et je vous recommanderais d'utiliser une bibliothèque - (par exemple, votre société DotImage si vous utilisiez .NET).

Voici une description détaillée cependant:

L’Exif lui-même est à l’intérieur d’un AppMarker - les trois octets précédents seront E1 (AppMarker 1) et la taille des données du marqueur dans l’endianité du fichier. Deux octets après l'Exif, vous verrez le marqueur de finalité (par exemple, 49 49 signifie II , ce qui signifie Intel, petit endian - cela signifie que les nombres à 2 octets ont d'abord l'octet faible dans le fichier).

Le reste des données utilise largement les décalages, le décalage étant dû à l'emplacement du premier octet final (le 49 dans le cas ci-dessus)

8 octets à partir de ce décalage est un nombre de 2 octets qui correspond au nombre de balises exif. Si vous êtes dans l'ordre des octets II , inversez les octets pour lire la longueur.

Ensuite, il y aura ce nombre d'enregistrements de 12 octets. Chacun est:

2 bytes: Tag ID
2 bytes: Tag Type
4 bytes: Length
4 bytes: data if the data is 4 bytes or less, or an offset to the data

Après les N 12 octets, les données désignées par chaque décalage utilisé dans les N enregistrements ci-dessus. Vous devez rechercher les identifiants et les types pour voir ce qu’ils veulent dire et comment ils sont représentés.

Autres conseils

Je suis un peu en retard pour la soirée, mais j'ai écrit une bibliothèque Java pour le traitement d'Exif . (entre autres types de métadonnées), je pensais que je pourrais y aller.

Exif

Exif est basé sur TIFF , le format de fichier d’image étiqueté. Nous devons donc d’abord examiner le format TIFF:

  • Un document TIFF contient plusieurs répertoires appelés IFD (répertoires de fichiers images)
  • Chaque IFD contient zéro ou plusieurs balises
  • Les IFD peuvent être liés à zéro ou plusieurs autres IFD
  • Chaque balise a un identifiant numérique et contient zéro ou plusieurs valeurs d'un type de données spécifié

Pensez à la structure comme à un arbre avec des valeurs primitives au niveau des feuilles. Le format TIFF décrit lui-même sa structure, mais il ne dicte rien sur la signification réelle des valeurs au niveau des feuilles .

En réalité, vous pouvez stocker tout type de données au format TIFF, elles ne sont pas couplées à des images.

Le fichier TIFF a un en-tête générique:

  • 2 octets pour l'ordre des octets, MM ou II en ASCII. Cela vous indique quel ordre prendre en compte tous les futurs octets - LSB ou MSB en premier.
  • 2 octets marqueur TIFF, pour Exif, il s'agit de 0x002A
  • 4 octets pointeur sur le premier IFD

Les IFD ont une structure également simple:

  • 2 octets pour le nombre de balises à suivre
  • N octets pour les balises elles-mêmes (où N = 12 * tagCount)
  • 4 octets pour le pointeur facultatif vers le prochain IFD (utilisez la valeur zéro si aucun IFD n'est lié)

Les balises ont une représentation simple sur 12 octets:

  • 2 octets pour l'ID de balise
  • 2 octets pour le type de données (int8u, int16s, float, etc.)
  • 4 octets pour le nombre de valeurs de données du type spécifié
  • 4 octets pour la valeur elle-même, si elle convient, sinon pour un pointeur sur un autre emplacement où les données peuvent être trouvées - il peut s'agir d'un pointeur sur le début d'un autre IFD

Les types de données sont prédéfinis. Par exemple: 1 représente des entiers non signés sur 8 bits et 12, des nombres à virgule flottante sur 64 bits.

Donc, avec tout ce que vous pouvez aller de l'avant et suivez le fichier de données. Quelques observations:

  • Vous ne pouvez pas lire les données dans l'ordre, car il est libre de faire des liens partout. Vous devez avoir un accès aléatoire ou le synthétiser en mettant en mémoire tampon.
  • Tout ce que vous savez à ce stade, c'est qu'une balise portant l'ID 0x1234 a 4 entiers: {1,2,3,4}

Pour décoder le format TIFF au format Exif, vous devez appliquer le dictionnaire définissant ce que chaque IFD représente et ce que chaque ID de balise de ces IFD représente.

JPEG

La plupart des utilisateurs de ma bibliothèque traitent des fichiers JPEG. Les JPEG ont une structure complètement différente, comprenant une séquence de segments. Chaque segment a un identifiant et un bloc d'octets. Exif se trouve dans le segment APP1 (valeur numérique 0xe1 ) d'un fichier JPEG. Une fois que vous avez cela, vous devez ignorer quelques octets ( Exif \ 0 \ 0 ) avant de voir le MM ou le II qui dénote le début des données Exif au format TIFF.

Tout rassembler avec un exemple

Voici une copie binaire de l'un des exemples d'images de ma bibliothèque:

Dans l'ordre:

JPEG démarre

  • FF D8 est le "numéro magique" JPEG.
  • FF marque le début d'un segment JPEG.
  • E1 indique le type de segment JPEG (il s'agit de APP1 , où Exif habite).
  • 18 B3 (6 323 décimales) donne la longueur du segment (y compris les octets de taille), nous savons donc que toutes les données Exif de ce fichier JPG seront placées dans le prochain

Wikipedia contient quelques indications sur le mode et le lieu de stockage exact des données EXIF. un fichier. Bien sûr, il existe toujours le standard lire lui-même.

C’est l’une des bonnes bibliothèques pour Java et EXIF: http: //www.drewnoakes. com / code / exif /

Il est assez fastidieux d’analyser des données EXIF, mais vous pouvez trouver de nombreuses bibliothèques pour les analyser. Mon préféré pour Java est,

http://www.java2s.com/Open-Source/Java-Document/Web-Server/Jigsaw/org/w3c/tools/jpeg/Exif.java.htm

http://jigsaw.w3.org/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top