Vamos a echar una carrerita

miércoles, 1 de agosto de 2007

Es la primera vez que hago cositas con GD, así que no seais muy duros conmigo. He escrito un script para generar una imagen similar a la del tipo de la Wii. Es bastante difícil, pero no me importaría llegar a los 86 kilos que tiene como meta.


$kilos = intval($_GET['kilos']);
if ($kilos == 0) $kilos = 111;

$iniciolinea = 10;
$finlinea = 270;
$iniciokilos = 126;
$finkilos = 86;
$fuentegrande = 5;
$fuentepeque = 4;
$fuentemini = 2;
$anchofuentegrande = imagefontwidth($fuentegrande);
$anchofuentepeque = imagefontwidth($fuentepeque);
$anchofuentemini = imagefontwidth($fuentemini);
$yimagen = 25;
$url = 'ecao.blogspot.com';
$diferenciakilos = $iniciokilos - $finkilos;
$diferencialinea = $finlinea - $iniciolinea;
$kilosperdidos = $iniciokilos - $kilos;
$kilosquefaltan = $kilos - $finkilos;
$x = $iniciolinea + intval((($kilosperdidos) * $diferencialinea) / $diferenciakilos) - 18;
$mensaje = "$kilosperdidos kgs perdidos, quedan $kilosquefaltan kgs!";
$anchomensaje = $anchofuentemini * strlen($mensaje);
$xmensaje = intval((280 - $anchomensaje) / 2);
$xkilos = $x - 40;
$anchobocadillo = 40;
$altobocadillo = 25;
$xcentrobocadillo = $xkilos + 13;


// imagenes de las que partimos
$imagen = imagecreate(280, 100);
$imagencaballero = imagecreatefromgif("knight.gif");
$base = imagesy($imagencaballero) + $yimagen;
$ykilos = $base - 50;
$ycentrobocadillo = $ykilos + 8;

// situamos al caballero
imagecopymerge($imagen,$imagencaballero, $x, $yimagen, 0,0, imagesx($imagencaballero), imagesy($imagencaballero), 100);

// colores a utilizar
$colorgris = imagecolorallocate($imagen, 169, 170, 173);
$colorceleste = imagecolorallocate($imagen, 50, 195, 239);


// regla
imageline($imagen, $iniciolinea, $base, $finlinea, $base, $colorgris);
for ($k = $iniciokilos; $k >= $finkilos; $k-=2)
{
 $xlinea = $iniciolinea + intval((($iniciokilos - $k) * $diferencialinea) / $diferenciakilos);
 $alto =  ($k % 10 == 0) ? 10 : 5; 
 imageline($imagen, $xlinea, $base+3, $xlinea, $base+$alto, $colorgris);
} 

// url
imagestring($imagen, $fuentepeque, $finlinea - ($anchofuentepeque * strlen($url)), 3, $url, $colorgris);

// kilos de origen / destino
imagestring($imagen, $fuentegrande, $iniciolinea, $base + 12, $iniciokilos, $colorceleste);
imagestring($imagen, $fuentegrande, $finlinea - ($anchofuentegrande * strlen($finkilos)), $base + 12, $finkilos, $colorceleste);

// bocadillo con kilos actuales
imagestring($imagen, $fuentegrande, $xkilos, $ykilos, $kilos, $colorceleste);
imageellipse($imagen, $xcentrobocadillo, $ycentrobocadillo, $anchobocadillo, $altobocadillo, $colorgris);
imageline($imagen, $xcentrobocadillo + ($anchobocadillo / 2), $ycentrobocadillo + 5, $x + 3, $ycentrobocadillo + 8, $colorgris);

// mensaje con los kilos perdidos y que faltan
imagestring($imagen, $fuentemini, $xmensaje, $base + 13, $mensaje, $colorgris);

// vuelca la imagen
header("Content-type: image/gif");
imagegif($imagen);
imagedestroy($imagen);

Para hacerlo funcionar, solo hay que copiarlo (junto con una imagen knight.gif al servidor Web (con soporte de PHP y GD) y pasarle como parámetro el numero de kilos de peso. Por ejemplo: http://localhost/evolucionpeso.php?kilos=111