bandes stylisees

GD génération de miniature et transparence

Comment supprimer l'alpha des png et gif lors de la génération de miniature avec gd

php transparence, php gd miniature

Date de publication : 2009-03-16 08:00:10

GD est la librairie de manipulation d'image la plus utilisée en php. Malgré le nombre limité de fonction qu'elle propose et ses performances limitées (comparé à imagemagick ou graphicsmagick) je l'utilise pour la génération de miniature.

Génération de miniature

Voici un petit exemple "basique" de script de génération de miniature, ce script évite les problème de noir qui apparaissent lors de la création de miniature sur des images transparentes (PNG ou GIF) en remplissant l'image avec du blanc opaque.


<?php
/**
* Example de génération de miniature avec GD et support de la transparence
* @author Patrick Poulain
* @licence GPL
* @see http://dev.petitchevalroux.net
*
*/
$srcFile = '/chemin/vers/le/fichier/image.jpg';
/*On définit la taille de la miniature*/
$thumbSize = array(50,50);
/*On récupère les informations sur l'image*/
$srcInfo = getimagesize($srcFile);
/*La fonction getimagesize a échoué*/
if($srcInfo === false)
{
trigger_error('impossible de récupérer les informations sur l\'image '.$srcFile);
exit();
}
/*On crée une ressource image adaptée au type de l'image source*/
switch ($srcInfo[2])
{
case IMAGETYPE_JPEG:
case IMAGETYPE_JPEG2000:
$srcImg = imagecreatefromjpeg($srcFile);
break;
case IMAGETYPE_PNG:
$srcImg = imagecreatefrompng($srcFile);
break;
case IMAGETYPE_GIF:
$srcImg = imagecreatefromgif($srcFile);
break;
default:
trigger_error('type d\'image non reconnu pour l\'image '.$srcFile);
exit();
}
$srcWidth = $srcInfo[0];
$srcHeight = $srcInfo[1];
/*On calcul le ratio de l'image*/
$ratio = $srcWidth / $srcHeight;
/*Si la largeur est limitante par rapport à la taille souhaitée de la miniature*/
if (($srcWidth / $thumbSize[0]) >= ($srcHeight / $thumbSize[1]))
{
$thumbWidth = min($srcWidth, $thumbSize[0]);
$thumbHeight = (int) ($thumbWidth / $ratio);
}
/*Si la hauteur est limitante*/
else
{
$thumbHeight = min($srcHeight, $thumbSize[1]);
$thumbWidth = (int) ($thumbHeight * $ratio);
}
/*On crée la ressource image pour la miniature*/
$thumbImg = ImageCreateTrueColor($thumbWidth, $thumbHeight);
/*Si l'image source est potentiellement transparente*/
if($srcInfo[2] === IMAGETYPE_PNG || $srcInfo[2] === IMAGETYPE_GIF)
{
/*On active l'alpha*/
imagealphablending($thumbImg, false);
imagesavealpha($thumbImg,true);
/*On remplit la miniature avec un blanc opaque*/
imagefill($thumbImg,0,0,imagecolorallocatealpha($thumbImg, 255, 255, 255, 127));
}
/*On ajoute l'image source dans la ressource de la miniature en la retaillant*/
imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $thumbWidth, $thumbHeight, $srcWidth, $srcHeight);
/*On indique au navigateur que le contenu est une image jpeg*/
header('Content-Type: image/jpeg');
/*On envoi l'image au navigateur*/
imagejpeg($thumbImg);
?>

Bien entendu ce script n'est pas à utiliser tel quel sur votre site car il n'a aucune fonctionnalité de cache de miniature. Je traiterai prochainement le cache de miniature dans un autre article.

Image : spitfirelas

 
 

b1n@sp1n