diego sevilla’s weblog
it is better to remain silent and be thought a fool,
than to open your mouth and remove all doubt -- groucho marx

4/1/2006

2006

Filed under: english, español, código/code, fotografía/photo — Diego Sevilla @ 18:14 — In English

El anterior post me dio una idea de poner todas mis fotos formando un mosaico, pero algo más original. Así que ni corto ni perezoso cogí el programa banner de UNIX y generé el patrón de puntos de “2006″. No sé si habéis usado ese programa. A mí me gusta mucho. Se le puede seleccionar el ancho de la bandera. En mi caso, quería que hubiera exactamente 2006 puntos. Al probar con un ancho 81, salían 1999 puntos, por lo que tuve que añadir 7 a la derecha del 6.

Con un pequeño progrma perl transformé los caracteres en medidas de puntos dentro de una imagen grande que pudiera contener a todas ellas.

Después, con otro pequeño programa que pondré a continuación, y usando la librería Imagemagick, pude generar la imagen final. Tardó 40 minutos y procesó 3,2 GB, lo que ocupan las 2006 imágenes que utilicé. El programa, muy sencillo, es el siguiente:

#! /usr/bin/perl

use Image::Magick;

$| = 1;

my @points = (
# points (suprimido)
);

$cols = 94;
$rows = 81;

$xstep = 43;
$ystep = 32;

$xsize = $cols * $xstep;
$ysize = $rows * $ystep;

my ($thumbnail);

$thumbnail=Image::Magick->new(size=>"${xsize}x${ysize}",
                              pointsize=>24,
                              fill=>‘black’);
$thumbnail->Read("xc:white");

while (@points)
{
    my $x = shift @points;
    my $y = shift @points;
    my $imagename = shift @ARGV;
    push @ARGV, $imagename;

    my $imagen = Image::Magick->new();
    $imagen->Read($imagename);
    $imagen->Resize(width=>$xstep,height=>$ystep);

    $thumbnail->Composite(image=>$imagen,x=>$x,y=>$y);
    print ".";
}

$thumbnail->Write("2006.jpg");

Y he aquí el resultado:


UNIX banner program + perl + Imagemagick + 2006 images = Happy 2006!

Tamaño original (1,3MB): aquí (JPG).

Actualización: El programa completo lo podéis descargar aquí, y las instrucciones para utilizarlo:

$ find directorio_de_imágenes -iname *.jpg | xargs perl composite.pl

Genera el fichero 2006.jpg.

14 Comments »

  1. ¡Qué envidia!

    Envidia porque se te ocurrió a tí primero, envidia porque te quedó muy bien :-)

    ¡Feliz año Diego!

    Comment by Germán Poo Caamaño — 4/1/2006 @ 19:08

  2. Friki, que eres un friki!!
    jejeje, es coña, me gusta mucho tu mosaico, pero sabes como me encantaría? con las fotos como fondo, y el 2006 en blanco. Ala, ya tienes deberes :-)

    Comment by Chavalina — 4/1/2006 @ 19:31

  3. @Germán! No te preocupes, se me ocurren pocas como esa :)

    @Chavalina: Jaja, desde luego que es friki… a ver qué soy yo si no… En cuanto a la inversión y poner las fotos en el fondo, también es una muy buena idea, la probaré después. Es también bastante fácil con el programita ese :) . Por cierto, chavalina, enhorabuena por el rediseño de Usalo.com.

    Saludos!
    diego.

    Comment by Diego Sevilla — 4/1/2006 @ 20:33

  4. muy bonito, muy ingenioso, felicidades…

    Comment by Nelson — 4/1/2006 @ 20:33

  5. Ahora mismo voy a probarlo, aunque creo que me tardara un pelin mas ;P (Sempron 2400)

    Comment by Carlos — 5/1/2006 @ 0:01

  6. Podrias explicar todo el proceso?, es que la verdad, yo de perl, como que no tengo ni idea, y acabo de instalar el banner y no trae pagina de man. Lo del banner lo mirare pero la primera parte con el programita que has hecho en perl, pues no me veo muy capaz de hacerlo yo.

    Muchas gracias.

    Comment by Carlos — 5/1/2006 @ 0:32

  7. Carlos, lo que voy a hacer es poner el programa perl completo para descargar. El programa ya contiene todos los puntos, que no he listado aquí porque era muy largo. Lo he añadido al final del post. La manera de utilizarlo es:

    $ find directorio -iname \*.jpg | xargs perl composite.pl

    Esto genera la imagen 2006.jpg. Ten en cuenta que tienes que tener instalado Imagemagick y perlmagick.

    Saludos!
    diego.

    Comment by Diego Sevilla — 5/1/2006 @ 0:40

  8. Muchas gracias!!!!, voy a probarlo.

    Comment by Carlos — 5/1/2006 @ 10:23

  9. Hola de nuevo,

    Lo intento pero no me funciona, a ver si me puedes ayudar (un poco mas). Cuando lanzo el proceso, al poco rato (con unas 500 y pico fotos), se queda sin memoria (512 M) y sin swap (256 Mb), y peta, pone algo asi como: ‘xargs: perl: terminated by signal 9′, antes de petar esta un rato procesando con nada de swap y jugando con muy poca ram, pero va haciendo.

    Que puedes ser?, pruebo a poner mas swap?

    Por otro lado, podrias decir como hiciste la parte del principio?, es para ver si puedo poner otra cosa en vez de 2006

    Muchas gracias de nuevo

    Comment by Carlos — 6/1/2006 @ 23:53

  10. Pues a mí, depende de qué fotos le pase al script, o me pasa lo mismo que a Carlos, o se me queda a medio generar el segundo cero y me genera una imagen con un “2″, “0″ y medio “0″.

    Si puedes explicar cómo se consiguen las coordenadas partiendo de banner sería mucho más personalizable y te estaríamos muy agradecidos :)

    Muy bueno el mosaico.

    Comment by Raul Khalil — 9/1/2006 @ 0:33

  11. Hola:

    Perdonad por la tardanza. No he probado el programa en ordenadores de 512MB de RAM. Empecé a ejecutar el programa en el portátil, pero lo corté a medio. En princpio no tiene que tener problema, ya que cada imagen la carga, la procesa y la desecha, por lo que el gasto de memoria era casi constante durante la ejecución. Os pongo aquí el programa que usé para generar los valores:

    my @lineas = <>;
    
    my $count = 0;
    
    $ydelta = 32;
    $xdelta = 43;
    $y = $ydelta * 80;
    $x = 0;
    
    while ($count != $#lineas)
    {
            @letters = split(”", $lineas[$count]);
    
            foreach (@letters)
            {
                print “$y, $x,n” if (/#/);
    
                $y-=$ydelta;
            }
    
            $count++;
            $x += $xdelta;
            $y = $ydelta * 80;
    }
    

    Yo lo ejecuté como

    banner -w81 | perl programa.pl

    Espero que os sirva.

    Saludos!
    diego.

    Comment by Diego Sevilla — 9/1/2006 @ 2:04

  12. Yo de nuevo!, muchas gracias otra vez.

    Lo he probado de nuevo, y he puesto un archivo de swap de 4 gigas (un poco exagerado pero con uno de 1 giga tambien petaba), y parece que funciona.
    He querido hacer la prueba con otras palabras, lo primero comentar que he quitado la ultima coma en el ultimo punto que nos retorna el script, despues decir que parece que me salen como espacios en blanco, pero creo que eso es mas culpa de la fotografia en si (utilizo muchas de estas de moviles, que son pequeñas para ir haciendo pruebas), y ya por ultimo, preguntarte como puedo cambiar el ancho de la imagen final, me explico, para hacer una prueba, he puesto la palabra ‘prueba’ con un ancho de 50 columnas (793 puntos) y una vez a hecho todo el proceso, la imagen final queda como muy alta y estrecha porque se como la letra final ‘a’ entera.

    Muchas gracias de nuevo y espero no molestarte mas :P

    Comment by Carlos — 9/1/2006 @ 23:24

  13. Hola, Carlos!

    Me alegro de que te funcione! 50 columnas es muy poco. Si pones más te saldrá bien, siempre que cuentes el número de líneas que da como resultado el “banner” y lo pongas en “$cols” en el programa del post. Luego, para generar los puntos, tienes que cambiar las líneas:

    $y = $delta * 80;
    

    por el número de columnas del “banner” menos 1. (en este caso eran 81, y puse 80). Y ajustar convenientemente $cols y $rows en el programa generador. La verdad es que todo esto se podría hacer de una forma más automática, pero como lo hice muy rápido, pues así quedó :)

    Saludos!
    diego.

    PD. Por cierto, espero ver las imágenes!!!

    Comment by Diego Sevilla — 9/1/2006 @ 23:49

  14. hiya cool 2006 pic cant read wot ne of u av put cos it int in ma language but its cool neway u may need more pics!!!

    Comment by daniel — 7/6/2006 @ 16:23

RSS feed for comments on this post. TrackBack URI

Leave a comment

Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>


Anti-Spam by WP-Morph 

Creative Commons License
This work is licensed under a Creative Commons License.
EWWV  AWStats  Site Meter 24 queries. 0.084 seconds. Powered by WordPress
406035 email messages processed in this box. 10858 were spam

0