Hace tiempo que hice este código, y me he decidido a hacer un pequeño tutorial

Por si no sabes que es un gradiente, es un fondo que empieza en un color, y poco a poco cambia hasta otro color.
El código tiene 2 direcciones, horizontal y vertical.
Al código se le envia por get los siguientes parametros:
Ancho: ancho que tendrá la imagen
Alto: alto que tendrá la imagen
Color1: Color inicial
Color2: Color final
Dir: h o v según sea horizontal o vertical
Los colores se podrán dar en hexadecimal con 3 o 6 caracteres, o RGB separado por comas (ej: F00, FF0000; 255,0,0 para rojo)
Todas las comprobaciones las agrupo en un solo if, que explicare por partes, el if completo es:
if(!$_GET['color1'] or !$_GET['color2'] or !$_GET['ancho'] or !$_GET['alto'] or !$_GET['dir'] or (!eregi('^[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}$', $_GET['color1']) && !eregi('^[a-fA-F0-9]{3}$', $_GET['color1']) && !eregi('^[a-fA-F0-9]{6}$', $_GET['color1'])) or (!eregi('^[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}$', $_GET['color2']) && !eregi('^[a-fA-F0-9]{3}$', $_GET['color2']) && !eregi('^[a-fA-F0-9]{6}$', $_GET['color2'])) or !is_numeric($_GET['ancho']) or !is_numeric($_GET['alto']) or (strtolower($_GET['dir']) != 'v' && strtolower($_GET['dir']) != 'h')) { die('error'); }
!$_GET['color1'] or !$_GET['color2'] or !$_GET['ancho'] or !$_GET['alto'] or !$_GET['dir']
Es para comprobar que todas las variables existan
(!eregi('^[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}$', $_GET['color1']) && !eregi('^[a-fA-F0-9]{3}$', $_GET['color1']) && !eregi('^[a-fA-F0-9]{6}$', $_GET['color1'])) or (!eregi('^[0-9]{1,3},[0-9]{1,3},[0-9]{1,3}$', $_GET['color2']) && !eregi('^[a-fA-F0-9]{3}$', $_GET['color2']) && !eregi('^[a-fA-F0-9]{6}$', $_GET['color2']))
Con eregi comprobamos como son los colores, comprueba cada 1 de los colores para ver si corresponden al hexadecimal o RGB, esto usa expresiones regulares, que es otro tema.
or !is_numeric($_GET['ancho']) or !is_numeric($_GET['alto'])
Comprueba que el ancho y el alto sean numericos
or (strtolower($_GET['dir']) != 'v' && strtolower($_GET['dir']) != 'h')
Comprueba que dir sea h o v, strtolower sirve para pasarlo a minuscula y que puedan poner H o V sin problemas.
Una vez completada esta comprobacion vamos a "procesar" los colores. GD funciona con RGB, asique si está en hexadecimal lo pasaremos a RGB:
if(eregi('^[a-fA-F0-9]{3}$', $_GET['color1'])) { // Si es hexadecimal con 3 caracteres
$r1 = hexdec($_GET['color1']{0}.$_GET['color1']{0}); // hexdec pasa hexadecimal a decimal, que es cada numero del rgb, como son 3 numeros, debemos poner 2 veces el primer numero. Para quien no lo sepa al poner {0} obtenemos el 1er caracter, con {1} el segundo, etc
$g1 = hexdec($_GET['color1']{1}.$_GET['color1']{1});
$b1 = hexdec($_GET['color1']{2}.$_GET['color1']{2});
// esto igual
} elseif(eregi('^[a-fA-F0-9]{6}$', $_GET['color1'])) { // Si es hexadecimal con 6 caracteres
$r1 = hexdec($_GET['color1']{0}.$_GET['color1']{1}); // Exactamente igual que arriba, pero ponemos el 1er y 2º caracter
$g1 = hexdec($_GET['color1']{2}.$_GET['color1']{3}); // Con el 3er y 4º
$b1 = hexdec($_GET['color1']{4}.$_GET['color1']{5}); // Con el 5º y 6º
} else {
list($r1, $g1, $b1) = explode(',', $_GET['color1']); // Si es rgb, hacemos un explode para separarlo por la coma y con list convertimos cada elemento deel array a las variables
}
if(eregi('^[a-fA-F0-9]{3}$', $_GET['color2'])) {
$r2 = hexdec($_GET['color2']{0}.$_GET['color2']{0});
$g2 = hexdec($_GET['color2']{1}.$_GET['color2']{1});
$b2 = hexdec($_GET['color2']{2}.$_GET['color2']{2});
} elseif(eregi('^[a-fA-F0-9]{6}$', $_GET['color2'])) {
$r2 = hexdec($_GET['color2']{0}.$_GET['color2']{1});
$g2 = hexdec($_GET['color2']{2}.$_GET['color2']{3});
$b2 = hexdec($_GET['color2']{4}.$_GET['color2']{5});
} else {
list($r2, $g2, $b2) = explode(',', $_GET['color2']);
}
// Repetimos con el 2º color
if($r1 > 255 or $g1 > 255 or $b1 > 255 or $r2 > 255 or $g2 > 255 or $b2 > 255) { die('error'); }
// Si algun color es mayor de 255 (el numero maximo de RGB) damos error
header('Content-type: image/gif'); // ponemos un header para indicar que sera una imagen gif
$img = imagecreatetruecolor($_GET['ancho'], $_GET['alto']); // creamos la imagen con las medidas de GET
Esto ya es el código en si.
if($_GET['dir'] == 'h') { // Si la dirección es horizontal
/* incrementos, es la cantidad de "color" que debe sumarse por cada pixel.
Se calcula restando al segundo color el primero, y diviendolo por el ancho de la imagen (imagesx)
Cada incremento es para el Red, Green y Blue: ir, ig e ib respectivamente.
*/
$ir = ($r2-$r1)/imagesx($img);
$ig = ($g2-$g1)/imagesx($img);
$ib = ($b2-$b1)/imagesx($img);
for($i=0;$i<imagesx($img);$i++) { // con esto recorremos cada pixel de la imagen
$color = imagecolorallocate($img, $r1, $g1, $b1); // creamos el color para este pixel
imageline($img, $i, 0, $i, imagesy($img), $color); // dibujamos una linea desde arriba hasta abajo, de un pixel, en el pixel actual ($i) y con el color anterior
// Sumamos los incrementos
$r1 += $ir;
$g1 += $ig;
$b1 += $ib;
}
} else { // Si la direccion es vertical
// Los incrementos, esta vez dividimos entre el alto
$ir = ($r2-$r1)/imagesy($img);
$ig = ($g2-$g1)/imagesy($img);
$ib = ($b2-$b1)/imagesy($img);
for($i=0;$i<imagesy($img);$i++) { // recorremos cada pixel de arriba a abajo
$color = imagecolorallocate($img, $r1, $g1, $b1); // El color
imageline($img, 0, $i, imagesx($img), $i, $color); // La linea, esta vez horizontal
// incrementamos
$r1 += $ir;
$g1 += $ig;
$b1 += $ib;
}
} // Fin del if de la dirección
Nuestra imagen está ya creada, solo nos queda mostrarla:
imagegif($img); // Mostramos la imagen
imagedestroy($img); // Destruimos la imagen para liberar memoria
Sobra decir que hay que incluir las etiquetas de <?php y ?>
Esto podria usarse asi: archivo.php?ancho=100&alto=100&color1=F00&color2=FFF&dir=h
Cualquier duda posteadla y os respondere encantado.
Salu2!