Avec PHP, redimensionner une image pour en faire un thumbnail (image timbre, vignette... nommez-le comme vous voulez!) est un jeu d'enfant. Il suffit d'avoir accès à la librairie graphique GD qui permet de générer et de manipuler les images de façon avancée.
Pour montrer à quel point c'est simple, les quelques lignes de code suivantes permettent de prendre une image et de la réduire à 25% de sa taille d'origine. Aussi, je commenterai étape par étape ce qui se passe.
Afin de faciliter la lecture, je définis une variable indiquant le chemin de l'image source et une autre pour spécifier à quel endroit et sous quel nom on enregistrera le thumbnail.
$source_file = 'images/image.jpg';Ensuite, on récupère la taille de l'image source et on calcule la largeur et la hauteur de la nouvelle image à créer.
$output_file = 'images/thumb.image.jpg';
list($src_width, $src_height) = getimagesize($source_file);Pour procéder à la redimension, on doit d'abord créer un canevas d'image pour y accueillir les données. Ce canevas sera créé à l'aide de la fonction imagecreatetruecolor().
$percent = 0.25; // 25%
$thumb_width = $src_width * $percent;
$thumb_height = $src_height * $percent;
$img_destination = imagecreatetruecolor($thumb_width, $thumb_height);On récupère la source de l'image pour pouvoir la manipuler. Dans mon exemple, ce sera un fichier JPEG mais on peut aussi utiliser les fonctions imagecreatefromgif() et imagecreatefrompng() pour travailler avec des images au format GIF et PNG.
$img_source = imagecreatefromjpeg($source_file);L'appel suivant permet de copier l'image source en totalité ou en partie (représenté par la suite de zéros) et de placer le résultat dans la ressource $img_destination.
imagecopyresampled($img_destination, $img_source, 0, 0, 0, 0, $thumb_width, $thumb_height, $src_width, $src_height);Avec ce qu'on a récupéré, on est prêt à enregistrer le nouveau fichier. Dans la fonction, le dernier chiffre représente la qualité, 100 étant la valeur maximale. Ici aussi, on pourra y substituer les fonctions imagegif() et imagepng() selon le format. D'ailleurs, c'est à cette étape qu'on pourra passer d'un format à un autre (convertir un JPEG en PNG par exemple).
imagejpeg($img_destination, $output_file, 90);Et on termine par un nettoyage pour libérer la mémoire allouée.
imagedestroy($img_destination);Ma dernière recommandation : pour une question de performance, évitez de surexploiter la transformation d'images en direct...
imagedestroy($img_source);