<?php
// ------------------------------------------------------------------------- //
// Création de miniatures avec affichage dans un tableau multidimentionnel //
// ------------------------------------------------------------------------- //
// Auteur: Grand'Pa <grandpa@altern.org> //
// Web: http://www.lagueuleouverte.net/scripts/ //
// ------------------------------------------------------------------------- //
/*
Lorsque l'on dispose d'une grande quantité d'images, il est très pratique d'en
afficher des miniatures dans un tableau afin d'alleger le temps de chargement
des pages html.
Ce script vous permet de réaliser facilement un tel album. En présuposant que
vos images se trouvent dans un sous-répertoire photos/, on va créer des miniatures
du type "mini_nomdevotreimage.jpg" et un fichier html "thumbnails.html" sous la
forme d'un tableau de trois colonnes sur X lignes, qui vous permettra d'afficher
votre album.
Attention! Ce script nécessite PHP 4.0.6 ainsi que la librarie GD 2.0.1.
*/
#############################################################################
# Script par Jérémy Audry (grandpa@altern.org) si vous l'utilisez, merci #
# de ne pas enlever le présent message :) #
#############################################################################
function resize($file) //voici la fonction qui redimensionne les images
{
$size = getimagesize("photos/$file");
# getimagesize() retourne un tableau de 4 éléments.
# L'index 0 contient la largeur. L'index 1 contient la longueur. L'index 2
# contient le type de l'image : 1 = GIF, 2 = JPG,
# 3 = PNG, 5 = PSD, 6 = BMP.
# L'index 3 contient la chaîne à placer dans les balises
# HTML : "height=xxx width=xxx"
# (source www.php.net)
//détermine la taille de la miniature, ici l'on désire qu'elles soient d'un
// sixième de leur taille normale
$dest_width = ($size[0]/6);
$dest_eight = ($size[1]/6);
$src_img = imagecreatefromjpeg("photos/$file");
$dst_img = imagecreatetruecolor($dest_width,$dest_eight);
imagecopyresampled($dst_img, $src_img, 0, 0, 0, 0, $dest_width, $dest_eight,
$size[0], $size[1]); // la fonction qui redimensionne les photos
imagejpeg($dst_img, "photos/mini_$file", 60);
imagedestroy($src_img);
imagedestroy($dst_img);
}
// on ouvre le répertoire contenant les photos à réduire
$dir = opendir("photos/");
$i = 0; // on initialise le compteur
echo "<table>\n\n"; // on commence le tableau...
//on commence à contruire le fichiers thumbnails.html
$build_fichier = "<table>\n<tr>\n";
while($file = readdir($dir)) // lit le contenu du répertoire des photos
{
//construit une colonne du tableau
$colonne = " <td valign='middle' align='center'>\n ".
"<a href='/photos/$file'><img src='photos/mini_$file' ".
"border='0' alt='$file'></a><br>$file\n </td>\n";
# la fonction readdir() renvoie aussi "." et ".." ce qui correspond aux
# répertoires supérieur et inférieur (non? je ne sais pas exactement),
# donc il faut éliminer ces résultats de $file, ici par une regex qui
# cherche toutes les valeurs de $file commencant par un point suivi ou
# non d'autres points, il faut également éliminer les valeurs de $file
# qui commence par "mini" (dans le cas où des miniatures ont déjà été
# créer), sous peine de créer les miniatures des miniatures :)
// on élimine donc les résultats parasites
if(ereg("^\.?\.+$", $file) || ereg("^mini", $file))
{
unset($file); // on détruit $file
}
else // sinon on peut enfin créer les miniatures!
{
// si le reste de $i / 3 (le nombre de colonnes désirées) égale 0 et
// que $i n'en est pas à sa première itération (pour éviter d'avoir une
// ligne "<tr>" parasite au début, c'est que l'on peut commencer une ligne
if ($i%3==0)
{
echo "\n<tr>\n"; // on commence une ligne du tableau
$build_fichier .= "\n<tr>\n";
}
if($i %3 !=0 OR $i %3 == 0)
{
resize($file); // on appel la fonction qui redimensionne les images
echo "$colonne"; // on affiche une colonne
$build_fichier .="$colonne";
}
$i++; // on incrémente le compteur
// puisque $i a été incrémenté une ligne plus haut, la condition
// ci-dessous recevra une valeure de $i différente du début de la
// boucle, donc on peut fermer la ligne
if ($i%3==0)
{
echo "\n</tr>\n";
$build_fichier .= "\n</tr>\n";
}
}
}
echo "\n</table>"; // on ferme le tableau
$build_fichier .= "\n</table>";
closedir($dir); // on ferme le répertoire
if ($thumbs = fopen("thumbnails.html", "w+")) // ouvre un nouveau fichier
{
// on insert la variable $build_fichier construite précédement dans le
// fichier html
fputs($thumbs, "$build_fichier");
}
fclose($thumbs);
// insère un lien vers le fichier crée
echo "\n<br><a href='thumbnails.html'>Lien vers votre fichier de miniatures</a>";
/*
Evidement, ce script est personnalisable à l'envie : on peut fort bien imaginer que $file
provienne du résultat d'une requète sur une bdd, de mettre le repertoire à lire et la
taille des miniatures en paramètres recueillis via un formulaire...
La fonction imagecopyresampled() est très lente, aussi dans le cas de très nombreuses
images, ont peut envisager de préférer ce script en ligne de commande et/ou de séparer les
fichiers "thumbnails.htlm" en plusieurs.
Le tableau, c'est aussi un script qui peut être repris dans un tas d'autres cas :)
*/
?>