Desafío Pintando a Nemo
#3 Solución de Voronwë
Ver código
|
Ver comentarios (2)
|
Descargar código
Fecha: 18 abril 2005
Tamaño: 35750 caracteres
Comentarios: 2
Solución online:
Lo siento, pero no está disponible
Valoración









7.75
(4 votos)
"Vaya con la recursividad y PHP... no se llevan muy bien con el tratamiento de imagenes :P"
Valora esta solución
<?
/*
Desafio Pintando a Nemo (pobre de él)
'''''''''''''''''''''''''''''''''''''
El código esta hecho por TaoK y Voronwe para php-hispano.net :P
Si quereis algo: voronwe[arroba]elponeypisador.com
Y sino... pues hasta pronto
*/
function rellenar($img,$x,$y,$c_pintar,$c_fondo = null) {
if ($x > 0 && $y > 0 && imagesx($img) > $x && imagesy($img) > $y) {
// si las coordenadas entran dentro de la imagen
$xini = $x; $yini = $y; // guardamos X e Y
$c_pixel = imagecolorat($img, $x, $y); // $c_pixel es el color del pixel que estamos tratando
if (!isset($c_fondo)) $c_fondo = $c_pixel;
// si la variable que contiene el color de fondo que estamos buscando esta pasada por parametro o no
while ($c_pixel == $c_fondo && $y > 0 && imagesx($img) > $y) {
// bucle que recorre del eje Y del pixel que estamos tratando
while ($c_pixel == $c_fondo && $x > 0 && imagesx($img) > $x) {
// bucle que recorre del eje X del pixel que estamos tratando
if ($modo == 'der') {
// si se esta recorriendo el eje hacia la derecha
if (imagecolorat($img,$x-1,$y+1) != $c_fondo && imagecolorat($img,$x,$y+1) == $c_fondo)
// inferior izquierda diferente de fondo y el inferior es igual a fondo
$img = rellenar($img,$x,$y+1,$c_pintar,$c_fondo);
if (imagecolorat($img,$x-1,$y-1) != $c_fondo && imagecolorat($img,$x,$y-1) == $c_fondo)
// si el pixel superior izquierda es diferente de fondo y el pixel superior es igual a fondo
$img = rellenar($img,$x,$y-1,$c_pintar,$c_fondo);
}
elseif ($modo == 'izq') {
// si estamos recorriendo el eje hacia la izquierda
if (imagecolorat($img,$x+1,$y+1) != $c_fondo && imagecolorat($img,$x,$y+1) == $c_fondo)
// si el pixel inferior derecha es diferente de fondo y el pixel inferior es igual a fondo
$img = rellenar($img,$x,$y+1,$c_pintar,$c_fondo);
if (imagecolorat($img,$x+1,$y-1) != $c_fondo && imagecolorat($img,$x,$y-1) == $c_fondo)
// si el pixel superior derecha es diferente de fondo y el pixel superior es igual a fondo
$img = rellenar($img,$x,$y-1,$c_pintar,$c_fondo);
}
else null;
imagesetpixel($img,$x,$y,$c_pintar); // pintamos el pixel actual
if (!isset($modo)) { // si es el primer pixel que tratamos
if (imagecolorat($img,$x+1,$y) == $c_fondo ) { // si el pixel de la derecha tiene un color igual al de fondo
$modo = 'der'; // entramos en modo derecha
$x++; // incrementamos en el eje X
} else { // si el pixel de la derecha es diferente de fondo entramos en modo izquierda
$modo = 'izq';
$x--; // decrementamos
}
} elseif ($modo == 'der') { // si estamos en modo derecha
if (imagecolorat($img,$x+1,$y) == $c_fondo ) { // comprobamos el color del pixel de la derecha
$x++;
} else { // si es diferente del fondo
$x = $xini-1; // volvemos a la X inicial menos 1 (para no volver a tratar el pixel inicial
$modo = 'izq'; // entramos en modo izquierda
}
}
else $x--; // si no es ni nulo ni derecha es izquierda, decrementamos
$c_pixel = imagecolorat($img, $x, $y); // cojemos el siguiente pixel a tratar
} // fin while x
$x=$xini; // al salir del bucle de las X volvemos al X inicial
if (!isset($dir)) { // si no subimos ni bajamos por el eje Y
if (imagecolorat($img,$x,$y+1) == $c_fondo ) { // comprobamos el color del siguiente pixel
$dir = 'inc'; // iniciamos incremento por el eje Y
$y++;
} else { // entramos en modo descendente
$dir = 'dec';
$y--;
}
} elseif ($dir == 'inc') { // si estamos en modo incremento de Y
if (imagecolorat($img,$x,$y+1) == $c_fondo ) { // comprobamos color
$y++; // incrementamos Y
} else { // si es diferente del color de fondo
$y = $yini-1; // volvemos a Y inicial
$dir = 'dec'; // cambiamos de direccion
}
}
else $y--; // estamos en modo descendente, decrementamos Y
unset($modo); // deseteamos la variable $modo usada para el while de X
$c_pixel = imagecolorat($img, $x, $y); // cojemos el siguiente pixel a tratar del eje Y
} // fin while y
} // fin if x e y
return $img; // devolvemos la imagen
}
function tmm(){ // funcion php4 para sacar los milisegundos, en php5 usad microtime(true)
$time=microtime();
$time=explode(" ",$time);
return $time[1]+$time[0];
}
$i=imagecreatefrompng('nemo.png'); // obtener de la imagen inicial
$microtime = tmm(); // tiempo inicial
// colores
$rojo = imagecolorallocate($i,255,0,0);
$negro = imagecolorallocate($i,0,0,0);
$marron = imagecolorallocate($i,96,67,27);
$naranja = imagecolorallocate($i,255,124,16);
$azul = imagecolorallocate($i,0,0,200);
$gris = imagecolorallocate($i,222,222,222);
// partes del nemo
$i = rellenar($i,284,406,$rojo); // pintar lengua
$i = rellenar($i,260,400,$negro); // pintar boca
$i = rellenar($i,60,300,$gris); // pintar ojo derecho (des del punto de vista de nemo ;)
$i = rellenar($i,200,250,$gris); // pìntar ojo izquierdo
$i = rellenar($i,81,436,$naranja); // pintar aleta
$i = rellenar($i,333,468,$naranja); // otra parte q no recuerdo cual es
$i = rellenar($i,290,475,$naranja); // bueno, ya no recuerdo mas
$i = rellenar($i,320,120,$naranja);
$i = rellenar($i,275,130,$naranja);
$i = rellenar($i,400,200,$naranja);
$i = rellenar($i,320,360,$naranja);
$i = rellenar($i,300,100,$naranja);
$i = rellenar($i,300,160,$gris); // pintar trozo central
$i = rellenar($i,1,1,$azul); // pintar fondo
ImageString($i, 2, 5, 5, round(tmm()-$microtime, 3)."\"", $negro); // imprimir tiempo
header("Content-type: image/png");
imagepng($i);
imagedestroy($i);
?>