Hay unos errores en mi programa, y muy graves.
1.- la función trueColor() solo sirve para indicar que vamos a crear la imagen usando componentes de color, y no un sistema de paleta de colores. Pero en este caso no estamos creando una imagen, sino que la estamos leyendo. Así que esta función no nos sirve.
2.- la función getPixel() no devuelve el color (en sus componentes rojo, verde y azul), sino el índice dentro de la paleta de colores de a qué color pertenece ese pixel. Hay que usar la función rgb() para conocer sus componentes.
Analizando la imagen, resulta que las figuras (obviando los bordes) se componen del color número 0, que corresponde, en la paleta, a un nivel de rojo de 4, 2 de verde y 4 de azul (sería el color #040204).
Entonces, no vamos a usar la paleta de colores, sino que tenemos que analizar las componentes de color de cada píxel. Y consideraremos, en este caso, que los píxeles de las figuras serán aquellos que tengan componentes inferiores o iguales, numéricamente, a 4.
Entonces, el programa queda así:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict
;
use warnings
;
use GD
;
use constant LIMITE_COLOR
=> 0x04
;
my $fichero_imagen = $ARGV[0
] or die "Uso: $0 <imagen a procesar>\n";
my $gd_imagen = GD
::Image->new($fichero_imagen);
my ($ancho,$alto) = $gd_imagen->getBounds();
print "Dimensiones: $ancho x $alto\n";
## Leemos la imagen, aplanándola, a una lista, representando cada una de las columnas.
## Un '1' es que sí había píxeles negros (figura)
## Un '0' es que no había
my $columnas;
## Para todas las columnas
for my $i ( 0
.. $ancho -1
) {
my $hay_pixeles_de_figura; # Hay o no hay
## Para todas las filas de esa columna
for my $j (0
.. $alto -1
) {
my $color_pixel_paleta = $gd_imagen->getPixel($i,$j);
my ($color_pixel_rojo, $color_pixel_verde, $color_pixel_azul) = $gd_imagen->rgb($color_pixel_paleta);
#my $color_pixel = uc sprintf "%02x%02x%02x", $color_pixel_rojo, $color_pixel_verde, $color_pixel_azul;
#print ">$i;$j: $color_pixel_paleta: ($color_pixel_rojo, $color_pixel_verde, $color_pixel_azul) $color_pixel\n";
if ( $color_pixel_rojo <= LIMITE_COLOR
and $color_pixel_verde <= LIMITE_COLOR
and $color_pixel_azul <= LIMITE_COLOR
) {
$hay_pixeles_de_figura = 1; # ponemos la bandera a 1
last; # no necesitamos mirar más
}
}
## Guardamos el resultado de esa columna, como un dígito
$columnas .= ($hay_pixeles_de_figura) ? 1
: 0;
}
print "$columnas\n";
$columnas .= 0; # Para ayudar a la segunda regex, en caso de
# que exista una figura en la última columna
## Ayudas visuales
for my $x ( 0
.. length($columnas) -1
) {
print int $x++ / 10;
}
print "\n";
for my $x ( 0
.. length($columnas) -1
) {
print $x++ % 10;
}
print "\n";
## Ahora averiguamos cuántas figuras hay
my $numero_figuras = () = $columnas =~ /1+/g; # Buscamos cuántos bloques de '1' hay
print "Hay $numero_figuras figuras\n";
## Y ahora hay que saber en qué posiciones empiezan y terminan
if ($numero_figuras) {
## Lo que hacemos es buscar la combinación '01' para saber el comienzo
while ( $columnas =~ m/(^|0)1/g ) {
print "Posición inicial: ";
print pos($columnas)-1;
print "\n";
}
## y la combinación '10' para saber el final de cada figura
while ( $columnas =~ m/10/g ) {
print "Posición final: ";
print pos($columnas)-2;
print "\n";
}
}
__END__Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
La salida es la misma que antes.
El porqué funcionaba antes es porque, por pura coincidencia, el color que obteníamos con getPixel() era el 0 (número de color 0 dentro de la paleta de colores) y ese valor se comparaba con lo que creíamos que eran los componentes de color de las figuras (NEGRO => 0x000000). Como numéricamente son iguales, pues entonces obteníamos la salida correcta. Pero era pura casualidad. No estaba asegurado que funcionara de la misma manera con otras imágenes.
Como ejemplo relacionado con tu código (que también está mal), estás mirando si el valor de getPixel() coincide con 0xFFFFFF. Bueno, pues resulta que la imagen del ejemplo, los píxeles de color blanco, en realidad, no son blancos, sino que tienen de valor 0xFCFEFC, correspondiente al color 34 de la paleta de colores, siendo ese número (34) el valor que te está devolviendo getPixel().
El ejercicio debería indicar si debemos mirar las componentes de color o la paleta de colores. Y qué color (o qué componentes) son las que definen a las figuras. Como mínimo, indicar la diferencia entre figura y fondo.