Aller au menu - Aller au contenu

Icône [Exif] Lire les infos d'une image

Mise à jour : 22/02/2009
171 visites depuis 7 jours , classé 437/777
Vous savez tous qu'une image se compose de pixels de différentes couleurs et j'espère également que vous savez les afficher sur une page web... Mais savez-vous qu'une image contient également de nombreuses informations et qu'il est possible de les afficher assez simplement ?

C'est ce que je vais essayer de vous expliquer dans ce premier tutoriel !

Exif ?! C'est quoi, ce truc ?

Exchangeable image file format, voilà la signification d'Exif. Pour être un tout petit peu plus clair, la librairie Exif de PHP vous permet de travailler avec les métadonnées des images. Vous pourrez donc tirer de vos images toutes sortes d'informations, telles que la date de la création de l'image, l'appareil photo utilisé...

C'est valable pour toutes les images ? :D

Hélas, non ! Il y a une restriction. Seules les images de type Jpeg (.jpg ou .jpeg) et Tiff sont en mesure de stocker ces données dans leur en-tête (oui, c'est ici que sont stockées les données). Cependant, toutes les images stockent leur résolution.

Qu'est-ce que je peux trouver comme informations dans mes images ou photos ?

Dans les en-têtes de vos images, vous allez pouvoir rassembler de nombreuses informations telles que :
  • la marque de l'appareil photo ;
  • son modèle ;
  • le réglage de l'appareil (focale, vitesse d'obturation, flash...) ;
  • l'orientation de l'image ;
  • la résolution ;
  • les date et heure de la prise de vue ;
  • le logiciel utilisé en cas de retouche ;
  • ...

La liste n'est pas exhaustive, mais vous pourrez en savoir plus ici :
http://fr.wikipedia.org/wiki/Exif

La partie culture s'achève, nous pouvons attaquer les choses sérieuses.

Exif en pratique

Ici, je vais vous présenter la méthode pour réaliser une fonction lecture_info_image, qui sera donc chargée de lire les informations de l'image, tout en vérifiant si elle est au bon format (Jpeg ou Tiff). Le code sera donc plus ou moins hors contexte et il vous faudra l'adapter à vos besoins.
N'hésitez pas à lire la doc PHP au sujet d'Exif : http://fr.php.net/manual/fr/ref.exif.php.

Dans le code suivant, vous trouverez la variable $img. Elle correspond au chemin de votre image. Par exemple, images/dossier1/mon_image.jpg.

Le chemin de l'image doit toujours être en relatif, ce qui veut dire qu'en aucun cas vous ne devrez utiliser un chemin du type http://www.sitemachin.com/dossier/image.jpg.


Pour qu'Exif fonctionne, l'option doit être activée (c'est la ligne extension=php_exif.dll de php.ini ; il faut retirer le point-virgule qui précède la ligne) dans PHP (exécutez la fonction phpinfo() si vous ne savez pas ce qu'il en est), et si ce n'est pas le cas, vous devez le faire. Il faut bien entendu avoir accès au fichier de configuration. Si vous n'avez aucune idée de ce dont je vous parle, lisez ceci qui explique comment activer une autre librairie, et prenez exemple sur la démarche à suivre. Même chose pour la librairie mbstring, qui elle est quasiment toujours activée.
Enfin, vérifiez bien que mbstring soit activée avant exif, faute de quoi exif ne pourrait être chargée correctement.

Nous l'avons vu précédemment : la fonction Exif ne fonctionne qu'avec des images de type Jpeg ou Tiff, il va donc falloir faire une sélection avant de rentrer à proprement parler son l'utilisation.
Pour cela, on va vérifier si l'image a bien une des extensions du tableau que l'on va passer en second paramètre à la fonction in_array(). On vérifie donc, en ayant pris soin de mettre l'extension en minuscules, si le texte situé après le point (donc, l'extension) correspond à l'un des formats d'image du tableau :

Code : PHP
1
2
3
4
5
6
7
<?php
if(in_array(strtolower(end(explode('.', $img))), array('jpg', 'jpeg', 'tif', 'tiff'))) // Si fichier Jpeg ou Tiff
 
{
  // Je lis les infos Exif
}
?>


Une fois assurés que l'image est d'un type correct, nous pouvons commencer à lire ses en-têtes avec la fonction exif_read_data() :
Code : PHP
1
2
3
4
5
6
<?php
if($exif = exif_read_data($img, EXIF, true)) // Si le fichier $img contient des infos Exif
{
  // Alors je lis ces informations
}
?>


Si l'image contient des informations Exif, alors ma variable $exif se verra remplie par ces informations.
Il nous faut alors passer en revue le tableau qui est dans cette variable pour extraire les valeurs que l'on souhaite.
On utilisera alors foreach :

Code : PHP
1
2
3
4
5
6
7
8
9
<?php
foreach ($exif as $key => $section) // On parcourt la première partie du tableau multidimensionnel
{       
    foreach ($section as $name => $value) // On parcourt la seconde partie
    {
        $exif_tab[$name] .= $value; // Récupération des valeurs dans le tableau $exif_tab
    }
}
?>


Mon but n'étant pas d'expliquer le foreach, je vous invite vivement à (re)lire le cours de M@teo21 si vous avez du mal avec ce code.

Le plus dur est fait ; il ne nous reste plus qu'à récupérer les valeurs que l'on vient de mettre dans le tableau. Bien entendu, elles ne sont pas forcement toutes utiles : c'est donc à vous de faire le tri. Je vous présente ci-dessous celles que j'ai utilisées.

Infos relatives aux photos



Une petite condition pour faire le tri des images (dans mon cas, chaque image est enregistrée dans une base avec un type :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$type = "photo_couleur";
 
if($type=="photo_n&b" || $type=="photo_couleur") {
  if($exif_tab['FocalLength']) // Si les données de la distance focale existent
  {
    $focale = round($exif_tab['FocalLength'], 0); // j'arrondis la valeur
    $focale = $focale." mm"; // Je rajoute l'unité millimètre
  }
  if($exif_tab['Make']) // Marque de l'appareil
    $marque = $exif_tab['Make'];
  if($exif_tab['Model'])// Modèle de l'appareil
    $modele = $exif_tab['Model'];
  if($exif_tab['ExposureTime'])// Vitesse d'obturation
    $vit_obt = $exif_tab['ExposureTime'];
  if($exif_tab['ISOSpeedRatings']) // Valeur iso
    $iso = $exif_tab['ISOSpeedRatings'];
  if($exif_tab['DateTimeOriginal'])
    $date = $exif_tab['DateTimeOriginal']; // Date de la prise de vue (heure de l'appareil)
 
  // La date est d'un format spécial, on va donc la rendre lisible
  $date2 = explode(":", current(explode(" ", $date)));
  $heure = explode(":", end(explode(" ", $date))); // Utile dans le cas où vous souhaitez extraire l'heure
  $annee = current($date2); // Je lis la valeur courante de date2
  $mois = next($date2); // Puis la suivante (c'est un tableau)
  $jour = next($date2); // Puis la suivante
 
  // Pour obtenir l'heure, faire de même avec $heure
}
?>


Si c'est une image réalisée par vos soins, il peut être intéressant d'afficher le logiciel utilisé :

Code : PHP
1
2
3
4
5
6
7
<?php
elseif($type=="image_perso")
{
  if($exif_tab['Software']) // Si l'information sur le logiciel existe
    $logiciel = $exif_tab['Software'];
}
?>


Pour finir, on peut extraire une donnée commune à tous les types d'images : la résolution.

Code : PHP
1
2
3
4
<?php
if (($exif_tab['Width'] && $exif_tab['Height']))
$resolution = $exif_tab['Width'].'*'.$exif_tab['Height'];
?>


Il ne vous reste alors plus qu'à afficher toutes ces variables selon vos besoins.
Voici ce que ça donne pour moi :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
echo "<span style='font-weight: bold;'>Appareil :</span><br />
 
Marque : $marque<br />
Modèle : $modele<br />
<span style='font-weight: bold;'>Caractéristiques :</span><br />
 
Focale : $focal<br />
Vitesse d'obturation : $vit_obt<br />
Iso : $iso<br />
Prise le : $jour/$mois/$annee<br />
A : $heure:$minute:$seconde<br />";
?>


Vous aurez remarqué que j'ai effectué le tri des informations lors de leur récupération. C'est un choix personnel. Vous pouvez très bien récupérer toutes les infos et conditionner l'affichage.


Je n'ai utilisé qu'une partie des informations contenues dans les images, ce sont celles qui me paraissent les plus importantes. Libre à vous de prendre d'autres. Elles sont toutes détaillées dans la doc PHP. ;)

Je ne mets volontairement pas le code complet de tout ce qui précède, simplement pour éviter les commentaires du style « j'ai fait un copier-coller, ça marche pas ! ». Le but étant d'apprendre, ce serait dommage que vous n'ayez pas à réfléchir pour recoller tous les éléments.

Voici ce que j'arrive à obtenir sur mon site :
Image utilisateur

Les petits plus

Vous êtes normalement en mesure de lire les infos exif de n'importe quelle image qui en contient. Cependant, il peut s'avérer utile de savoir si une image contient des infos, voire de restaurer des informations perdues.

Vérifier la présence d'informations Exif



Pour cela, il vous faut un logiciel en mesure de lire les informations.

Windows



Eh oui, ça peut peut-être vous étonner, mais Windows est tout à fait en mesure de vous dire si une image contient ou non les infos que l'on recherche.

Comment ?

Tout simplement en survolant votre image avec le curseur de la souris :


Image utilisateurImage utilisateur


Comme vous pouvez le voir, la première image ne nous indique que sa dimension et son poids. Elle ne contient donc pas d'informations Exif. Au contraire, la seconde image, elle, nous donne la date du cliché et le modèle d'appareil photo. L'image survolée contient les précieuses informations !
Le problème avec Windows, c'est qu'il ne donne qu'un extrait des informations. Peut-être existe-t-il un moyen de toutes les avoir, mais je ne le connais pas.
En revanche, il est possible de les obtenir avec un logiciel tiers...

Exifer



Exifer est un logiciel vous permettant de manipuler les images et notamment les informations qu'elles contiennent :
Image utilisateur

Vous remarquez que, sur la partie droite, vous retrouvez toutes (!) les informations exif possibles et imaginables !

Téléchargement du logiciel : par ici.

Restaurer des informations Exif



Vous l'avez vu précédemment, une image, même .jpg, peut ne pas avoir d'informations exif. Cela arrive très souvent avec les photos que l'on modifie avec un logiciel d'image.
Si vous disposez encore de l'original, vous pouvez restituer les informations à l'image modifiée.

Pour cela, nous allons utiliser Exifer.

Depuis Exifer, naviguez à travers vos dossiers jusqu'à trouver la photo qui a perdu ses infos exif, puis faites un clic droit > EXIF/IPTC > Insert from File... ; sélectionnez alors l'image source (celle qui n'est pas modifiée). Exifer copie alors les infos de l'image les possédant vers celle qui les a perdues.
Ce tutoriel est désormais terminé !
Rien de bien compliqué, si vous avez les notions de base en PHP.
Vous êtes désormais capables d'afficher de nombreuses infos sur vos images ou photos.

Partager

28 commentaires pour "[Exif] Lire les infos d'une image"
Note moyenne : 3.50 / 4 (2 votes)
Pseudo Commentaire
Hors ligne bizulk # Posté le 31/03/2010 à 15:59:46

Pour répondre à la question de ludovic.pecate (qui date) :
Il faut effectivement activer dans le fichier les extensions php_mbstring.dll et php_exif.dll (dans cet ordre) mais aussi modifier le répertoire de chargement des extensions dans le fichier php.ini :
par défaut j'avais extension_dir=c:\wamp\...\ext qui est un bon chemin mais juste au dessus j'avais un commentaire qui indiquait que sous windows il fallait mettre 'ext'.
Hors ligne Emporio # Posté le 02/05/2010 à 03:01:55
Avatar

Ville : Vira
Pays : France métropolitaine

Woua, ça fait 3 ans que je travaille avec PHP, et je ne savais pas que l'on pouvais tirer autant d'information que ça d'une image. Même si dans la pratique je vous pas l'utilité tout de suite, je tient a dire que je suis époustouflé par ce tuto.

Voila comment traquer les photo retouché sur face de bouq ^^

Secret (cliquez pour afficher)
Les membres qui ne m'aiment pas :
Cam - zingwai - Sh4rk - sebi - Speedking - Trickus - rotoclap
Me contacter si vous voulez être dans la liste :)

 
Hors ligne buchron # Posté le 10/08/2010 à 16:44:45
On ne va jamais aussi loin que
Avatar

Bonjour et merci pour ce tuto en or!

Pour ma part, j'utilise les données EXIF de mes fichiers jpg pour géolocaliser les photographies en comparant le DateTimeOriginal aux points récupérés par mon GPS.

Voici un exemple de ce que l'on peut faire : Géolocalisation images grâce aux données exif

Ma question est en rapport avec les données Exif mais, je ne souhaite plus seulement lire mais écrire avec php des champs Exif sur mes photos.

Est-ce que quelqu'un(e) peut me donner des tuyaux la dessus ?

Par avance merci,
Buchron

Ma passion ? Vous faire découvrir la mienne : C'est par là...;)
 
Hors ligne Musexp # Posté le 25/08/2010 à 00:41:45

Ville : Lille
Pays : France métropolitaine
Études : CNAM

@buchron : c'est pas sur les Exif mais sur les iptc. Ça peut peut-être t'intéresser quand même :
http://www.siteduzero.com/tutoriel-3-1 [...] c-en-php.html
Hors ligne buchron # Posté le 30/08/2010 à 11:39:14
On ne va jamais aussi loin que
Avatar

@Musexp

Bonjour et merci pour ce lien fort intéressant!

J'ai contourné le problème qui était pausé à savoir ne pas géolocaliser une image déjà géolocalisée en comparant le nom des images déjà localisées dans la base de données.

Mon code permet donc d'automatiquement géolocaliser des images avec le "dateTimeOriginal" et des données X Y de mon GPS.

Si il y à des intéressés par le code ou un tuto faites moi signe.

@+

Buchron

Ma passion ? Vous faire découvrir la mienne : C'est par là...;)
 

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.