- couleur de départ et de fin du dégradé au format hexadécimal,
- la hauteur et la largeur de l'image.
Dessiner sur le canvas d'un PNG
En fait, il n'existe pas de fonction dégradé dans la librairie GD de PHP. L'astuce consiste à tracer une multitude de ligne à chaque fois d'une couleur différente. Ainsi dans une boucle allant du 1er pixel à la largeur de l'image, la class dessine un trait.<?
/**
* Générer un degradé horizontal sur une image png
*/
class HorizontalGradient {
private $sColors=array('R'=>0, 'G'=>0, 'B'=>0);
private $eColors=array('R'=>0, 'G'=>0, 'B'=>0);
/**
* Fixer les couleurs de départ et de fin du dégradé
* @param string $startcolor
* @param string $endcolor
*/
public function setColors($startcolor, $endcolor) {
if (strlen($startcolor)==6) {
$this->sColors['R']=hexdec(substr($startcolor,0,2));
$this->sColors['G']=hexdec(substr($startcolor,2,2));
$this->sColors['B']=hexdec(substr($startcolor,4,2));
}
if (strlen($endcolor)==6) {
$this->eColors['R']=hexdec(substr($endcolor,0,2));
$this->eColors['G']=hexdec(substr($endcolor,2,2));
$this->eColors['B']=hexdec(substr($endcolor,4,2));
}
}
/**
* Dessiner le degradé sur l'image
* @param int $width
* @param int $height
*/
public function drawCanvas($width, $height) {
$canvas = imagecreatetruecolor($width, $height);
$steps['R']=($this->eColors['R']-$this->sColors['R'])/$width;
$steps['G']=($this->eColors['G']-$this->sColors['G'])/$width;
$steps['B']=($this->eColors['B']-$this->sColors['B'])/$width;
for ($i=0; $i<$width; $i++) {
$r = $this->sColors['R'] + $i*$steps['R'];
$g = $this->sColors['G'] + $i*$steps['G'];
$b = $this->sColors['B'] + $i*$steps['B'];
$c=imagecolorallocate($canvas,$r,$g,$b);
imageline($canvas, $i, 0, $i, $height, $c);
}
header("Content-Type: image/png");
imagepng($canvas);
imagedestroy($canvas);
}
}
?>
Dégradé bleu au violet
Utilisons la class pour créer un rectangle de 350 px sur 50 px, le dégradé s'opère de gauche à droite du violet au rose. Le résultat est affiché sous forme d'une image PNG directement dans le navigateur. Pour sauvegarder le dégradé, modifiez la class en supprimant le bloc header(...) et en indiquant le chemin de l'image à enregistrer.
<?
/**
* Exemple de dégradé
*/
$HorizontalGradient=new HorizontalGradient();
//du bleu au rose
$HorizontalGradient->setColors('0000FF', 'FF00FF');
//image de 350px X 50px
$HorizontalGradient->drawCanvas(350, 50);
?>
