Les informations exif d'un jpeg

 

Exchangeable image file format ou Exif est une spécification de format de fichier (reposant sur les formats JPEG, TIFF, ...). Cette spécification est utilisée par les appareils photo numériques pour stocker diverses informations comme les réglages de l'appareil au moment de la prise de la photo, mais aussi la date et l'heure et éventuellement la position GPS lors de la prise de la photo.

Android sachant travailler avec des fichiers jpg et les appareils sous Android ayant eux aussi une voire deux caméras intégrées, il apparaît normal que l'on puisse aussi gérer les informations exif que ces fichiers peuvent contenir. Il sera donc possible de les lire, mais aussi de les modifier !

 

Lecture / création / modification des informations exif

Les données sont sous forme de tag ou balise. La lecture ou la modification de ces données passera par une interface:

ExifInterface

 

La lecture

Les différentes méthodes de lecture sont:

 

Fonction Désignation
double getAltitude(double defaultValue) Retourne l'altitude en mètre
String getAttribute(String tag) Retourne la valeur d'une balise ou null si cette balise n'est pas présente dans le JPEG
double getAttributeDouble(String tag, double defaultValue) Retourne la valeur Double d'une balise
int getAttributeInt(String tag, int defaultValue) Retourne la valeur entière d'une balise
boolean getLatLong(float[] output) Retourne la latitude et la longitude dans un tableau de type float
byte[] getThumbnail() Retourne la vignette d'une photo dans un tableau de byte ou null si pas de vignette
boolean hasThumbnail() Retourne true si le JPEG possède une vignette


 

La création / modification d'une balise

NoteEn principe, les informations exif présentes sur une image ne devraient pas être modifiées. Lors de la prise de photo, il y a création de ces informations, puis les accès suivant devraient être des lectures.

Attention Evitez les modifications sur des photos provenant d'autres appareils (appareils photo compris) qui peuvent contenir bien plus d'informations et que vous risqueriez de perdre !

 

Pour positionner la valeur d'une balise, il suffit d'utiliser la méthode void setAttribute(String tag, String value) qui attendra le nom de la balise et la valeur sous forme de chaîne de caractères.

void setAttribute(String tag, String value)

NoteIl n'est pas possible d'ajouter d'autres balises que celles-ci !

Lorsque vous avez terminé de créer/modifier les attributs, il faudra mettre à jours le fichier avec ces nouvelles informations. Pour cela, il faudra utiliser la méthode:

void saveAttributes()

Vous utiliserez cette fonction qu'une fois, lorsque vous aurez affecté toutes les balises

NoteL'ajout d'informations exif passe en effet lors de la sauvegarde par la duplication de l'image dans un autre fichier accompagnée de l'ajout des informations exif. Le fichier image d'origine est ensuite détruit et la copie prend enfin le même nom que la photo d'origine. La sauvegarde peut donc prendre du temps.

 

Exemple de code

Voici un exemple de code qui va afficher les différentes balises présentes dans une image (image présente dans le premier volume utilisé pour l'external storage sous le nom eso1208a.jpg).

Le code va ensuite modifier deux informations exif:

TAG_MAKE que je positionne à "European Southern Observatory" (propriétaire de la photo)

et TAG_FLASH que je passe à 1.

Voici le MainActivity.java

Ainsi que le fichier AndroidManifest.xml

Et le layout composé d'un TextView qui recevra les valeurs des différents tag et d'un ImageView pour afficher l'image JPEG correspondant

Enfin, l'image utilisée pour cet exemple

Disque(de ESO/T. Preibisch extraite de la page du site https://www.eso.org/public/france/images/eso1208a/)

 

Annexe

La vignette dans un jpeg