Nello scrit viene creato un gradiente lineare fra due colori.La scelta è fra 6 colori, ma l'esempio è adattabile a tutta la gamma truecolor.Con $_POST è simulata l'acquisizione dei dati, poi dichiarati gli array $ColNUM e $ColTXT che contengono rispettivamente i valori esadecimali dei colori ed i loro nomi.La preparazione al gradiente viene svolta nella funzione CanaliStartEnd().La funzione CanaliStartEnd() è invocata due volte passandole prima il colore di inizio gradente e poi il coore finale. Ritornano, rispettivamente, i valori decimali di ciascun canale per i due estremi del gradiente.Viene poi calcolato l'incremento di ciascun canale colore in relazione allo spazio da disegnare (in questo caso orizzontale) inserendolo nell'array $rgbINCREMENTO.Questo valore è diverso per ciascun canale e proporzionale alla superfice da coprire.Viene poi lanciato un loop sull'immagine per la parte da colorare.Ad ogni ciclo, ciascun canale colore viane incrementato del valore di $rgbINCREMENTO ed il colore continuamente allocato degradando dolcemente fra gli estremi richiesti.
<?php
$ColoreA = isset($_POST['ColoreA']) ? $_POST['ColoreA'] : 2;
$ColoreB = isset($_POST['ColoreB']) ? $_POST['ColoreB'] : 0;
$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 immagine
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
}
$Colore = $ColoreA;
$rgbSTART = CanaliStartEnd($ColHEX,$Colore);
//echo "<br>".$rgbSTART[0]." | ".$rgbSTART[1]." | ".$rgbSTART[2];// valori decimali iniziali canali colore
$Colore = $ColoreB;
$rgbEND = CanaliStartEnd($ColHEX,$Colore);
//echo "<br>".$rgbEND[0]." | ".$rgbEND[1]." | ".$rgbEND[2];// valori decimali finali canali colore
$rgbINCREMENTO = array();
for($i = 0; $i<3; $i++)
{
$rgbINCREMENTO[$i] = ($rgbEND[$i]-$rgbSTART[$i]) / $Larghezza; // incremento valore per ciascun colore
}
//echo "<br>".$rgbINCREMENTO[0]." | ".$rgbINCREMENTO[1]." | ".$rgbINCREMENTO[2];
// incremento di ciascun canale colore
for($x=0; $x<$Larghezza; $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
}
header('Content-Type: image/png');
imagepng($Immagine,"NomeFile.png"); // salva
imagepng($Immagine); // al browser
imagedestroy($Immagine); // libera memoria