Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?
19 usuarios Online (0)
Darse de alta en la web | Recuperar password   
Inicio / Desafios / Pintando a Nemo / Solucion de Voronwë

Desafío Pintando a Nemo

#3 Solución de Voronwë

Código de la Solución Ver código | Comentarios Ver comentarios (2) | Descargar Descargar código

Fecha: 18 abril 2005

Tamaño: 35750 caracteres

Comentarios: 2

Solución online:
Lo siento, pero no está disponible

Valoración PuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuació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);
?>

Web alojada en Zilos

php-hispano.net 2002 - 2008 | XHTML 1.0
Datos Legales | Webmaster