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

Desafío Pintando a Nemo

#3 Solución de Aeoris

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

Fecha: 05 abril 2005

Tamaño: 37129 caracteres

Comentarios: 1

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

Valoración PuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuaciónPuntuación 7.00 (8 votos)

"Propongo cambiar el nombre del desafío a "Cocinando a Nemo" o "Haciendo sushi con Nemo" o algo parecido.
Enga, un saludo ;)

PD: El ojo morao se le queda, por cafre xD"

Valora esta solución

<?php

//Cabeceras de PNG, ya que el archivo resultante quiero que esté en un formato libre ^^
header('Content-type: image/png');

/**
* Podria usar otro numero como color del borde por defecto, pero como para este caso
*   el mas abundante, y el que necesito es el $borde (el color de los bordes de Nemo) pues
*   me ahorro definirlo cada vez :\
*
* Hay un fallo monumental en la función, y es que no colorea la superficie entera, sino
*   que colorea de izquierda a derecha, pero no comprobando arriba y abajo si hay
*   superficie a pintar. Esa es la razón de que haya tantas llamadas a la función
*/

function  colorear_superficie(&$img, $coordenada_x, $coordenada_y, $color,  $borde = 19)
{
    
//Hacer sushi al pobre Nemo puede tardar
    
set_time_limit(0);

    
//Ancho y alto de la imagen, se le dará varios usos
    
$img_x = imagesx($img);
    
$img_y = imagesy($img);

    
//Coordenadas fuera de la imagen? Pues va a ser que no
    
if ($coordenada_x >= $img_x) $coordenada_x = $img_x - 1;
    if (
$coordenada_y >= $img_y) $coordenada_y = $img_y - 1;

    
//Por no tener las variables desperdigadas, definimos un array para todas
    
$limit = array();

    
//Buscando el límite por la izquierda
    
for ($i = $coordenada_x; $i >= 0; $i--) {
        if (
imagecolorat($img, $i, $coordenada_y) === $borde) break;
        
imagesetpixel($img, $i, $coordenada_y, $color);
        
$limit['left'] = $i;
    }

    
//Buscando limite por la derecha
    
for ($i = $coordenada_x + 1; $i < $img_x; $i++) {
        if (
imagecolorat($img, $i, $coordenada_y) === $borde) break;
        
imagesetpixel($img, $i, $coordenada_y, $color);
        
$limit['right'] = $i;
    }

    
//Pintando desde las coordenadas dadas hacia arriba
    
if ($coordenada_y > 0) {
        
$limit['last_border'] = 1;
        for (
$i = $limit['left']; $i <= (isset($limit['right']) ? $limit['right'] : 0); $i++) {
            
$tmp_color = imagecolorat($img, $i, $coordenada_y - 1);
            if (
$limit['last_border'])
                if (
$tmp_color !== $borde && $tmp_color != $color) {
                    
colorear_superficie($img, $i, $coordenada_y - 1, $color);
                    
$limit['last_border'] = 0;
                }
            else if (
$tmp_color === $borde || $tmp_color === $color)
                
$limit['last_border'] = 1;
        }
    }

    
//Pintando desde las coordenadas dadas hacia abajo
    
if ($coordenada_y < $img_y - 1) {
        
$limit['last_border'] = 1;
        for (
$i = $limit['left']; $i <= (isset($limit['right']) ? $limit['right'] : 0); $i++) {
            
$tmp_color = imagecolorat($img, $i, $coordenada_y + 1);

            if (
$limit['last_border'])
                if (
$tmp_color !== $borde && $tmp_color !== $color) {
                    
colorear_superficie($img, $i, $coordenada_y + 1, $color);
                    
$limit['last_border'] = 0;
                }
            else if (
$tmp_color === $borde || $tmp_color === $color)
                
$limit['last_border'] = 1;
        }
    }
}

$nemo = imagecreatefromgif('nemo.gif');

$color['blue'] = imagecolorallocate($nemo, 200, 230, 230);
$color['orange_light']  = imagecolorallocate($nemo, 250, 110, 0);
$color['orange_soft']   = imagecolorallocate($nemo, 200, 40, 0);
$color['orange_dark']   = imagecolorallocate($nemo, 160, 20, 0);
$color['orange_soft2']  = imagecolorallocate($nemo, 255, 186, 87);
$color['red_dark']      = imagecolorallocate($nemo, 111, 22, 10);
$color['red_dark']      = imagecolorallocate($nemo, 111, 22, 10);
$color['red_light']     = imagecolorallocate($nemo, 188, 43, 24);
$color['pink_soft']     = imagecolorallocate($nemo, 229, 114, 84);
$color['ojomorao']      = imagecolorallocate($nemo, 190, 128, 179);

colorear_superficie($nemo, 150, 273, $color['orange_light']);
colorear_superficie($nemo, 262, 178, $color['orange_light']);
colorear_superficie($nemo, 321, 182, $color['orange_soft']);
colorear_superficie($nemo, 400, 210, $color['orange_dark']);
colorear_superficie($nemo, 400, 180, $color['orange_dark']);
colorear_superficie($nemo, 420, 140, $color['orange_dark']);
colorear_superficie($nemo, 440, 150, $color['orange_dark']);
colorear_superficie($nemo, 470, 200, $color['orange_dark']);
colorear_superficie($nemo, 450, 260, $color['orange_dark']);
colorear_superficie($nemo, 412, 330, $color['orange_dark']);
colorear_superficie($nemo, 430, 361, $color['orange_dark']);
colorear_superficie($nemo, 500, 300, $color['orange_dark']);
colorear_superficie($nemo, 500, 325, $color['orange_dark']);
colorear_superficie($nemo, 490, 355, $color['orange_dark']);
colorear_superficie($nemo, 470, 380, $color['orange_dark']);
colorear_superficie($nemo, 283, 46, $color['orange_soft2']);
colorear_superficie($nemo, 260, 77, $color['orange_soft2']);
colorear_superficie($nemo, 215, 125, $color['orange_soft2']);
colorear_superficie($nemo, 230, 125, $color['orange_soft2']);
colorear_superficie($nemo, 290, 58, $color['orange_soft2']);
colorear_superficie($nemo, 290, 54, $color['orange_soft2']);
colorear_superficie($nemo, 275, 120, $color['orange_soft2']);
colorear_superficie($nemo, 300, 120, $color['orange_soft2']);
colorear_superficie($nemo, 320, 120, $color['orange_soft2']);
colorear_superficie($nemo, 350, 135, $color['orange_soft2']);
colorear_superficie($nemo, 350, 160, $color['orange_soft2']);
colorear_superficie($nemo, 235, 415, $color['red_dark']);
colorear_superficie($nemo, 280, 410, $color['red_light']);
colorear_superficie($nemo, 81, 463, $color['pink_soft']);
colorear_superficie($nemo, 270, 470, $color['pink_soft']);
colorear_superficie($nemo, 330, 470, $color['pink_soft']);
colorear_superficie($nemo, 100, 450, $color['pink_soft']);
colorear_superficie($nemo, 90, 450, $color['pink_soft']);
colorear_superficie($nemo, 273, 461, $color['pink_soft']);
colorear_superficie($nemo, 290, 460, $color['pink_soft']);
colorear_superficie($nemo, 325, 465, $color['pink_soft']);
colorear_superficie($nemo, 340, 460, $color['pink_soft']);
colorear_superficie($nemo, 345, 440, $color['pink_soft']);
colorear_superficie($nemo, 220, 235, $color['blue']);
colorear_superficie($nemo, 70, 300, $color['ojomorao']);

//Esto es todo amigos!
imagepng($nemo);

?>

Web alojada en Zilos

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