La imagen anterior: Ghostscript + perl + ImageMagick

Como ando tan liado, dejé para después la explicación de cómo hice la imagen anterior. No es que sea una maravilla, pero por si a alguien le interesa o le da ideas, pongo aquí cómo lo he hecho.

Partí del documento actual de mi tesis, que generé como un fichero Postscript con LaTeX, aunque vale cualquier fichero Postscript o PDF. Usé entonces Ghostscript para convertir cada página en una imagen. Esto es sencillo, ya que el programa está preparado para eso:

$ gs -dBATCH -dNOPAUSE -sDEVICE=png16 -sOutputFile=fichero\%d.png fichero.ps

Esto genera una serie de ficheros «fichero1.png» a «ficheroN.png» donde «N» es el número de páginas del documento. Como dispositivo de salida usé el sencillo «png16» (imágenes PNG de 16 colores, por ahora no necesito más y la cosa va mucho más rápida).

A continuación escribí un programa en Perl usando la librería ImageMagick, que tiene bindings para Perl.


#! /usr/bin/perl

use Image::Magick;

$| = 1;

my $xstep = 100;

my $xsize = 4000;
my $ysize = 4000;
my $HALF = 2000;
my $thumbnail;

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

my $numimages = shift @ARGV;
my $radius = 1800;

my $PI = 3.141592654;
my $angle = 2 * $PI / $numimages;
my $actual_angle = $PI;

for $i (1..$numimages)
{
my $centerx = $radius * cos($actual_angle);
my $centery = $radius * sin($PI - $actual_angle);
my $imagen = Image::Magick->new();
$imagen->Read("tesis$i.png");
$imagen->Resize(width=>$xstep,height=>$xstep);

$thumbnail->Composite(image=>$imagen,x=>$centerx + $HALF - $xstep/2,
y=>$centery + $HALF - $xstep/2);

print ".";

$actual_angle += $angle;
if ($actual_angle > 2*$PI)
{
$actual_angle -= 2 * $PI;
}
}

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



En el ejemplo, el tamaño de la imagen es 4000x4000, por lo que el centro de la imagen está en el punto (2000,2000), y el radio elegido para el círculo es 1800 puntos. Cada imagen se redimensiona a 100x100 puntos, con lo que el dibujo queda más o menos proporcionado. Al menos todas las páginas se ven casi sin solapamiento. El programa se ejecuta como:

$ genera.pl N

donde «N» es al igual que antes, el número de páginas. El resultado lo encontráis aquí.

blog comments powered by Disqus