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