Créer un album photo en PHP
Première partie: création des vignettes
Pas à pas, exploration d'un cas pratique simple d'utilisation du PHP, au travers de la création d'un album photo.
Introduction
Dans cette nouvelle série de tutoriels, nous prenons l'exemple de
la création d'un album photo à partir d'images numérisées
pour examiner différents points du langage.
Dans cette première partie, nous allons écrire un petit script pour
parcourir un repertoire et ses sous-repertoires, récupérer les images
qui s'y trouvent et, à partir de ces images, créer des miniatures
(vignettes) que nous stockerons dans un autre repertoire, dédié.
Dans une prochaine étape, nous améliorerons le script en alimentant
également une base de données (description de l'image, emplacement,
etc.), puis nous utiliserons base et vignettes pour composer le "front-office"
de notre album photo.
Parcourir
Nous allons définir une fonction, intitulée scandir(),
qui va nous permettre, à partir d'un répertoire racine, de récupérer
les images de l'ensemble de l'arborescence, et de créer, à partir
de chacune, une vignette.
Découvrons tout de suite cette fonction:
function scandir($dir){
global $larg;
global $thumbdir;
$dossier=opendir($dir);
while($fichier=readdir($dossier)){
set_time_limit(0);
$l=array('.', '..');
if(!in_array($fichier,$l)){
if(is_dir($dir."/".$fichier)){
scandir($dir."/".$fichier);
}else{
if(substr(strtolower($fichier),(strlen($fichier)-4),4)==".jpg"
||
substr(strtolower($fichier),(strlen($fichier)-5),5)==".jpeg"){
$src=imagecreatefromjpeg($dir."/".$fichier);
$taille=getimagesize($dir."/".$fichier);
$img=imagecreate($larg,round(($larg/$taille[0])*$taille[1]));
imagecopyresized($img,$src,
0,0,0,0,
$larg,round(($larg/$taille[0])*$taille[1]),$taille[0],$taille[1]);
imagejpeg($img, $thumbdir."/tn_".$fichier);
}
}
}
}
}
La fonction utilise deux variables globales, l'une contient la largeur
des vignettes (les hauteurs de celles-ci seront calculées en préservant
le ratio initial), l'autre contient le chemin absolu vers le répertoire
de stockage des vignettes.
Le seul argument de la fonction est alors le répertoire courant (initialement
la racine choisie, ensuite - la fonction est récursive - les différents
sous-répertoires).
Nous utilisons la fonction opendir() pour caractériser
l'ouverture d'un (sous-)répertoire, readir() pour obtenir
les noms des fichiers de ce répertoire, is_dir() pour
déterminer si tel fichier est en fait un répertoire, ou non, enfin
in_array() pour déterminer si le nom de fichier n'appartient
pas à un tableau de noms exclus (ici les noms "." et ".."
(dossier racine et dossier parent sous Unix).
Une fois assurés que nous sommes bien en présence d'un fichier,
il nous reste à déterminer son extension (on convertit d'abord le
nom en minuscules avec strtolower() puis on extrait les 4 (ou
5) derniers caractères avec substr() - la taille de la
chaîne étant obtenue avec strlen()).
Il nous reste (voir cet article
pour une explication de l'enchaînement des opérations) à récupérer
l'image (imagecreatefromjpeg()), sa taille (getimagesize()),
créer une autre image vide de la taille correspondante à la taille
de la future vignette (imagecreate()), puis copier en redimensionnant
l'image source vers l'image ainsi créée (imagecopyresized()),
enfin sauvegarder sur le serveur le résultat (imagejpeg()).
L'ensemble de ces fonctions sont issues de la librairie
GD.
Voici pour cette première étape. Le prochain volet abordera la mise
en base de données de l'ensemble des informations nécessaires à
l'exploitation de ces vignettes au sein d'un "front-office".
[
Jérôme
Morlon,
1er juin 2002
,
JDNet
]
|