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