Autor Tema: Gradientes con GD  (Leído 783 veces)

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Gradientes con GD
« en: 04 de Noviembre de 2009, 16:30:12 pm »
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$i0$iimagesy($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($img0$iimagesx($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!
« Última modificación: 04 de Noviembre de 2009, 19:51:30 pm por westwest »

Comunidad PHPeros

Gradientes con GD
« en: 04 de Noviembre de 2009, 16:30:12 pm »

Desconectado Masato

  • PHPero Avanzado
  • ****
  • Mensajes: 480
  • Karma: 12
  • Sexo: Masculino
  • <?php echo "Solo quiero aprender php"; ?>
    • Ver Perfil
    • Masato Design!
Re:Gradientes con GD
« Respuesta #1 en: 04 de Noviembre de 2009, 19:48:18 pm »
O.o, muy buen tuto west, pero...tiene muchos get y me marean o.O, te ganaste un +1 :D

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Gradientes con GD
« Respuesta #2 en: 04 de Noviembre de 2009, 19:49:42 pm »
xD al fin uno responde (aunque... xD) gracias por el +

Desconectado Masato

  • PHPero Avanzado
  • ****
  • Mensajes: 480
  • Karma: 12
  • Sexo: Masculino
  • <?php echo "Solo quiero aprender php"; ?>
    • Ver Perfil
    • Masato Design!
Re:Gradientes con GD
« Respuesta #3 en: 04 de Noviembre de 2009, 19:54:59 pm »
>.<, aunque...?? xD

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Gradientes con GD
« Respuesta #4 en: 04 de Noviembre de 2009, 21:11:48 pm »
aunque el MP xD
« Última modificación: 04 de Noviembre de 2009, 21:19:14 pm por westwest »

Desconectado Masato

  • PHPero Avanzado
  • ****
  • Mensajes: 480
  • Karma: 12
  • Sexo: Masculino
  • <?php echo "Solo quiero aprender php"; ?>
    • Ver Perfil
    • Masato Design!
Re:Gradientes con GD
« Respuesta #5 en: 04 de Noviembre de 2009, 21:18:38 pm »
ha si xD...eso fue...como decirlo...insistir...para... xD

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Gradientes con GD
« Respuesta #6 en: 04 de Noviembre de 2009, 21:19:59 pm »
El hecho de que nadie mire este tutorial, me confirma que en esta comunidad todos son unos vagos... luego hablan que no lo son, los cojos de mahoma

Incluso masato :/
No hago los tutoriales por decir :O soy el puro amo, pero me gusta que se me reconozca el trabajo ¬¬

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Gradientes con GD
« Respuesta #7 en: 04 de Noviembre de 2009, 21:48:16 pm »
Hola,

Hoy a las 16:30:12. El thread es creado.
Hoy a las 21:19:59. "El hecho de que nadie mire este tutorial, me confirma que en esta comunidad todos son unos vagos..."

Dale tiempo, pero de ya te digo que en mi opinión has hecho un tutorial que necesita muchos mas conocimientos que los que tienen la mayoría de los usuarios.
No es que no visiten, es que quizás pusiste demasiada dificultad.

Saludos
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado TheGeorge

  • PHPero Avanzado
  • ****
  • Mensajes: 351
  • Karma: 13
  • Sexo: Masculino
    • Ver Perfil
    • websources
Re:Gradientes con GD
« Respuesta #8 en: 05 de Noviembre de 2009, 00:34:09 am »
Muy buen aporte, nunca se me ocurrió que se podría hacer eso con gd.

Te ganas un karma + westwest.
Y bien explicado.
Saludos.
¡Solo sé, que nada sé...!

Desconectado Masato

  • PHPero Avanzado
  • ****
  • Mensajes: 480
  • Karma: 12
  • Sexo: Masculino
  • <?php echo "Solo quiero aprender php"; ?>
    • Ver Perfil
    • Masato Design!
Re:Gradientes con GD
« Respuesta #9 en: 05 de Noviembre de 2009, 03:16:03 am »
Como dice TLX, mucha complejidad, tené en cuenta que hay varios que recién están aprendiendo PHP, y bue:

Citar
luego hablan que no lo son, los cojos de mahoma

Incluso masato :/

Vos me mandaste el MP justo cuando iba a meterme en tutoriales, tené en cuenta que recién entraba y estaba checando todos los demas post.