TUTORIELS 
Manipuler des vignettes (thumbnails)
Différentes méthodes pour créer des vignettes d'images, notamment via la librairie GD en PHP ou en Perl, et l'outil netpbm en ligne de commande.  (03 octobre 2001)
 

La problématique
Les catalogues de produits nécessitent bien souvent, à partir d'images existantes (parfois de différents formats et tailles), la production de vignettes (thumbnails). Pour cela deux approches sont possibles: la création des vignettes en amont, puis la publication sur le web, ou la création "à la volée" de vignettes.

La première approche a l'avantage de ne pas ralentir l'exécution des scripts dynamiques, qui vont récupérer les vignettes déjà stockées sur le serveur. Mais cela nécessite une double manipulation lors d'une mise à jour: créer la vignette et la publier.

L'autre approche permet de publier l'image en taille réelle (qui bien souvent doit l'être de toute façon si le catalogue propose une fonction d'agrandissement des vignettes) et de laisser le script faire le travail de production de la vignette et d'affichage.
A condition qu'elles ne soient pas trop importantes, les mises à jour sont facilitées (d'autant que les vignettes déjà produites et qui ne doivent pas être modifiées n'ont pas à être engendrées à nouveau, car elles seront sauvegardées sur le serveur).

Plusieurs outils sont disponibles
Dans le premier cas (production en amont des vignettes), un outil comme Thumbnailer (pour Windows) est certainement un bon choix. Sous Linux, on pourra utiliser par exemple netpbm: on écrira ainsi par exemple:

jpegtopnm $fichier_image | pnmscale -xysize $nouvelle_largeur $nouvelle_hauteur | ppmtojpeg > $fichier_vignette

On peut encore utiliser ImageMagick, également en ligne de commande.

Dans le second cas (production dynamique des vignettes), les outils netpbm et ImageMagick restent bien sûr valides (en PHP ou en Perl, on utilisera les fonctions d'appel de commandes), mais il est également possible d'utiliser la librairie graphique GD (voir notre article consacré à cet outil), de la manière suivante (code PHP):

$image = ImageCreateFromJpeg("$fichier_image");

$largeur = imagesx($image); $hauteur = imagesy($image);
$vignette = ImageCreate($nouvelle_largeur, $nouvelle_hauteur);

ImageCopyResized($vignette, $image, 0, 0, 0, 0,
                                     $nouvelle_largeur, $nouvelle_hauteur,
                                     $largeur, $hauteur);

ImageJpeg($vignette, "$fichier_vignette");


les variables $fichier_image, $nouvelle_largeur et $nouvelle_hauteur étant des paramètres variables.

En Perl, il est aussi possible d'utiliser GD grâce à GD.pm, mais uniquement pour du GIF. On écrira alors:

open (GIF,"$fichier_image") || die;
$image = newFromGif GD::Image(GIF) || die;
close GIF;

($largeur, $hauteur ) = GD::Image::getBounds( $image);

$vignette = new GD::Image($nouvelle_largeur,$nouvelle_hauteur);

$vignette->copyResized($image, 0, 0, 0, 0, $nouvelle_largeur, $nouvelle_hauteur,
$largeur, $hauteur);

$fichier_vignette = $vignette->gif;

GD offre un moyen simple de redimensionner les images pour créer des vignettes, et présente notamment l'atout d'être installé avec les versions récentes de PHP (moins de manipulations seront nécessaires, en tout état de cause, pour installer GD que pour installer netpbm ou ImageMagick).

A l'inverse, GD présente certains désavantages. Pour des questions de droits, la librairie ne peut plus manipuler le format GIF au delà de la version 1.6, et n'offre pas le support du JPEG en deçà de la version 1.8! Une restriction de taille pour qui veut manipuler à la fois des images JPEG et des images GIF (d'autant que pour de petites images, le GIF est préférable).
Par ailleurs, la qualité des vignettes produites par GD semble légèrement inférieure à leurs équivalents en utilisant netpbm.

Le choix est donc ouvert, et dépendra en outre de la plate-forme utilisée, du langage choisi, ou même de la politique de sécurité. Mais les méthodes ne manquent pas.

 
[ Jérôme Morlon,JDNet
 
Accueil | Haut de page