Desafío Pintando a Nemo
#3 Solución de Aeoris
Ver código
|
Ver comentarios (1)
|
Descargar código
Fecha: 05 abril 2005
Tamaño: 37129 caracteres
Comentarios: 1
Solución online:
Lo siento, pero no está disponible
Valoració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);
?>