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 !
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 ?
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.
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 : PHP1
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 : PHP1
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 : PHP1
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 : PHP1
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 : PHP1
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 :