Vignettes d'images en PHP à hauteur et largeur définies
Créer des vignettes: Deuxième partie
Dans cette deuxième partie, le script de vignettes, ou thumbnail, va être perfectionné de sorte que la hauteur et la largeur de la vignette soient toutes deux définies pour toutes les vignettes, tout en gardant les proportions des images initiales.
En effet l'inconvénient du script de thumbnail de la première partie, était de redimensionner l'image à une hauteur ou largeur donnée au choix, mais que l'autre dimension restait variable ce qui ne permet pas de réaliser des galeries.
Pour arriver à ce résultat, préférable dans une page Web, on va redimensionner l'image pour créer une vignette intermédiaire qui conserve les proportions, et ensuite rogner soit en hauteur, soit en largeur, selon la forme de l'image initiale.
Calcul des dimensions de la vignette intermédiaire
La vignette intermédiaire aura la largeur ou la hauteur de la vignette affiché, selon que c'est la hauteur ou la largeur qui est inférieure à l'autre dimension.
Dimensions de la thumbnail
Dans la démo, les dimensions sont de 150 en hauteur et 140 en largeur. On pourrait choisir n'importe quelles valeurs.
$thumbh = 150; $thumbw = 140;
Choix de la formule
Faut-il rogner sur la hauteur ou sur la largeur?
Si la vignette intermédiaire à une hauteur de 150, sa largeur
sera supérieure ou égale à cette valeur.
Si elle a une largeur de 140, sa hauteur doit être supérieure
ou égale.
Pour l'anticiper ou calcule les ratios hauteur / largeur de l'image et de la vignette.
$ratio = $h / $w; $nratio = $thumbh / $thumbw;
Si ratio, la proportion originelle, est supérieure à nratio, la proportion de la vignette finale, on doit rogner sur la hauteur. Sur la largeur dans l'autre cas.
Et si on rogne sur la hauteur, on redimensionne l'image selon la largeur.
Redimensionner sur la largeur
Dans le cas ou ratio est supérieur à nratio, autrement dit l'image originelle est trop haute par rapport à la vignette à réaliser, on crée une vignette intermédiaire en se basant sur la largeur voulue:
$x = intval($w * $nh / $h);
if ($x < $nw)
{
$nh = intval($h * $nw / $w);
}
else
{
$nw = $x;
}
On définit x, la largeur intermédiaire en redimensionnant l'image par la formule w * nh / h.
Si x est inférieur à la largeur désirée, on redimensionne
l'image sur la hauteur par la formule nh = h * nw / w.
Sinon on conserve la hauteur et on donne à la nouvelle largeur nw la
valeur intermédiaire x.
Redimensionner sur la hauteur
Si le nouveau ratio nratio est supérieur au ratio originel ratio, l'image est plus large que haute, il faut la réduire en se basant sur la hauteur, et rogner ensuite en largeur.
$x = intval($h * $nw / $w);
if ($x < $nh)
{
$nw = intval($w * $nh / $h);
}
else
{
$nh = $x;
}
Les calculs sont inversés.
Créer l'image intermédiaire
Les fonctions PHP de la première partie sont de nouveau utilisées pour réduire l'image:
$resimage = imagecreatefromjpeg($oldname); $newimage = imagecreatetruecolor($nw, $nh); imageCopyResampled($newimage, $resimage,0,0,0,0,$nw, $nh, $w, $h);
Mais en outre, il faut rogner l'image, donc on crée une image vide sur laquelle on copie une partie de la vignette intermédiaire.
$viewimage = imagecreatetruecolor($thumbw, $thumbh); imagecopy($viewimage, $newimage, 0, 0, 0, 0, $nw, $nh);
Ne reste plus qu'à sauver la vignette
Dans la démo, un tableau d'image est scanné par la structure foreach. Voir le code source complet.
Galerie de vignettes créées avec le script
Cliquer pour voir l'image originelle.
Code source
- Voir le script de vignette PHP complet.
- Télécharger l'archive avec le script et les images.