Con una tecnica simile a quella del Gradiente lineare a 2 colori, è possibile creare gradienti a tre o più colori che degradano fra loro,
basta considerare che il colore finale di un gradiente è l'iniziale del gradiente successivo.
<?php
$ColoreA = isset($_POST['ColoreA']) ? $_POST['ColoreA'] : 3;
$ColoreB = isset($_POST['ColoreB']) ? $_POST['ColoreB'] : 0;
$ColoreC = isset($_POST['ColoreC']) ? $_POST['ColoreC'] : 4;
$ColHEX = array(); $ColTXT = array(); // colori e loro nomi
$ColHEX[0] = "FF0000"; $ColTXT[0] = "Rosso"; $ColHEX[1] = "00FF00"; $ColTXT[1] = "Verde";
$ColHEX[2] = "0000FF"; $ColTXT[2] = "Blu"; $ColHEX[3] = "FFFF00"; $ColTXT[3] = "Giallo";
$ColHEX[4] = "FF00FF"; $ColTXT[4] = "Viola"; $ColHEX[5] = "00FFFF"; $ColTXT[5] = "Azzurro";
$Larghezza = 700; $Altezza = 200;// dimensioni immagine
$Immagine =
imagecreatetruecolor($Larghezza, $Altezza); // crea immaigine
function CanaliStartEnd($ColHEX,$Colore){// valore decimale canali
$rgb = array();
$rgb[0] = hexdec(substr($ColHEX[$Colore],0,2)); // rosso;
$rgb[1] = hexdec(substr($ColHEX[$Colore],2,2)); // verde
$rgb[2] = hexdec(substr($ColHEX[$Colore],4,2)); // blu
return $rgb; // ritorna quantità colore di pertenza per ognuno dei 3 canali
}
function CalcolaIncremento($rgbSTART,$rgbEND,$Estensione){//calcola incremento per canale colore
$rgbINCREMENTO = array();
for($i = 0; $i<3; $i++)// incremento valore per ciascun colore
{$rgbINCREMENTO[$i] = ($rgbEND[$i]-$rgbSTART[$i]) / $Estensione; }
return $rgbINCREMENTO; // ritorna incremento per ciascun canale colore
}
function DisegnaGradiente($Immagine,$Altezza,$Estensione,
$rgbSTART,$rgbINCREMENTO,
$StartGradiente,$EndGradiente
)
{
for($x=$StartGradiente; $x<$EndGradiente; $x++){// loop sull'immagine
$Colore =
imagecolorallocate($Immagine, $rgbSTART[0],$rgbSTART[1],$rgbSTART[2]); // alloca il colore
imageline($Immagine,$x,0,$x,($Altezza), $Colore); // linea verticale
// incrementa valori dei canali canali
$rgbSTART[0] = $rgbSTART[0] + $rgbINCREMENTO[0]; // rosso
$rgbSTART[1] = $rgbSTART[1] + $rgbINCREMENTO[1]; // verde
$rgbSTART[2] = $rgbSTART[2] + $rgbINCREMENTO[2]; // blu
}
}
function StartNEW($rgbSTART,$rgbEND){// nuovo colore start è il colore end dalla fase precedente
for($i=0; $i<3; $i++){$rgbSTART[$i] = $rgbEND[$i];}
return $rgbSTART;
}
/*** fase 1 colori A B ***/
$Colore = $ColoreA;
$rgbSTART = CanaliStartEnd($ColHEX,$Colore);// ritorna quantità colore per ogni canale
$Colore = $ColoreB;
$rgbEND = CanaliStartEnd($ColHEX,$Colore);// ritorna quantità colore per ogni canale
$Estensione = $Larghezza/2;
$rgbINCREMENTO = CalcolaIncremento($rgbSTART,$rgbEND,$Estensione);//calcola incremento per canale
$StartGradiente = 0; $EndGradiente = $Larghezza/2;
DisegnaGradiente($Immagine,$Altezza,$Estensione,
$rgbSTART,$rgbINCREMENTO,
$StartGradiente,$EndGradiente); // COLORI A B
/*** fase 2 colori B C ***/
$rgbSTART = StartNEW($rgbSTART,$rgbEND); // nuovo colore iniziale è il colore finale della fase precedente
$Colore = $ColoreC;
$rgbEND = CanaliStartEnd($ColHEX,$Colore);// ritorna quantità colore ogni canale
$Estensione = $Larghezza/2;
$rgbINCREMENTO = CalcolaIncremento($rgbSTART,$rgbEND,$Estensione);//calcola incremento canale
$StartGradiente = $Larghezza/2; $EndGradiente = $Larghezza;
DisegnaGradiente($Immagine,$Altezza,
$Estensione,$rgbSTART,$rgbINCREMENTO,
$StartGradiente,$EndGradiente); // COLORI B C
header('Content-Type: image/png');
imagepng($Immagine,"NomeFile.png"); // salva
imagepng($Immagine); // al browser
imagedestroy($Immagine); // libera memoria
?>