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
En 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.
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)
Il 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
L'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
(de
ESO/T. Preibisch extraite de la page du site https://www.eso.org/public/france/images/eso1208a/)
Annexe