Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Langage, bibliothèques et fonctions > Lecture du tutoriel

[Exif] Lire les infos d'une image

Avatar
Auteur : grunk
Créé : le 27/07/2006 14:32:26
Modifié : le 19/04/2008 11:08:10
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
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 !
Sommaire du chapitre :

Exif ?! C'est quoi, ce truc ?

Exchangeable image file format, voila 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 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

Je vais vous présenter, ici, 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 a le bon format (Jpeg ou Tiff). Le code sera donc plus ou moins hors contexte. Il vous faudra donc 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 (affichez 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 aux fichiers 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.

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 dans l'utilisation de la fonction Exif.
Pour cela, on va vérifier si l'image a bien une des extensions, dans le tableau en deuxième paramètre de la fonction in_array(). On vérifie donc, en ayant pris soin de mettre l'extension en minuscule, 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
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 correcte, nous pouvons commencer à lire les en-têtes de l'image avec la fonction exif_read_data() :
Code : PHP
1
2
3
4
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
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 celle que j'ai utilisée.

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
$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_opt = $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
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
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
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'opturation : $vit_opt<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 dans le style "j'ai fait un copier-coller, ça marche pas !". Le but étant d'apprendre, ça 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


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.
Auteur : grunk
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 680 Zéros connectés | Requêtes SQL 7 requêtes | Temps de génération de la page : Total (SQL) 0.0621s (0.048s)