PNG2ASCII: de Png a Ascii Art con Perl
|
´´´´´´´´´´´´´´´¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨´´
´~¤¤¤&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&~´
¨¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤&$&¨
´¤$$0000000000000000000000000000000000000$~´
´´´´´´´´´´´´´´´´´´´´´´¨¨¨¨¨´´´´´´´´´´´´´´
·¤&¤¤&&~´
¨¤&¤¤¤&¤´
´¤&¤¤¤&¤¨
´¨¨·~~~~~·¨´ ´~&¤¤¤&&¨
´·~¤¤~~~~¤¤¤¤&&&~¨´ ´~&¤¤¤&&·
´~¤~~~~¤¤¤&&&&&¤¤~¤&&·´ ´·&¤¤¤&&·
·¤¤~~¤¤&$&&¤¤¤&$$&¤~~~&¤¨ ·¤¤¤¤¤&~´
·¤¤~¤¤&&·´ ´~¤¤¤¤¤&$&·´ ·¤¤¤~¤&~´
¨¤¤~~¤&~´ ´~¤~~~¤&$&·´ ·¤¤¤~¤&~´
·&¤~~¤~´ ´~¤~~~¤&$&·´ ·¤¤~~¤&~´
´~&¤~~¤~´ ´·¤~~~¤¤$&·´ ´·¤¤~~¤&~´
~$&¤~¤~¨¨¤&¤¤¤¤$&·´ ´~¤~~~¤&~´
¨&$&~~¤~´·&0$$&·´ ´·¤¤~~¤¤&~´
·&$¤~~¤¤·´¨·¨´ ´·~¤~~~¤¤&¤¨
·&$&¤~~¤¤¤¤~~~~~¤¤¤~~~~¤&$&·´
´~$$&¤¤~~~~~~~~~~¤¤¤&$$¤¨´
´·&$$$$&&&&&&$$$$¤~¨´
´¨·~~~~~·¨¨´
|
Codigo
(bajar)
#!/usr/bin/perl
#
# Transforma un PNG a un simil en ASCII ART
# Calculando la luminancia promedio.
#
# Basado en http://www.codeproject.com/aspnet/ascii_art_with_c_.asp
#
# Dependencias
# GD.pm - http://search.cpan.org/dist/GD/
#
# Uso
# $ ./png2ascii.pl image.png > image.txt
#
# Autor
# agramajo _at_ gmail _dot_ com
# 20050129
#
use GD;
$|++;
$debug = 0;
#
# levantamos la imagen
#
$img = newFromPng GD::Image($ARGV[0]) || die;
#
# buscamos los limites
#
($width,$height) = $img->getBounds();
print "($width,$height)\n" if $debug;
#
# recorremos la imagen mediante pixels ( x , y )
# achicamos la imagen un caracter por pixel seria mucho
#
for ( $h = 0; $h < $height/10; $h++ ) {
$starty = $h * 10;
print "$starty\n" if $debug;
for ( $w = 0; $w < $width/5; $w++ ) {
$startx = $w * 5;
print "$startx\n" if $debug;
$bri = 0;
$i = 0;
for ( $y = 0; $y < 10; $y++ ) {
for ( $x = 0; $x < 10; $x++ ) {
$cy = $y + $starty;
$cx = $x + $startx;
#
# buscamos los RGB del pixel y calculamos la Luminancia
# 0 < lum < 255
# http://www.guides.sk/scantips2/lumin.html
#
my $idx = $img->getPixel($cx,$cy);
my ($r,$g,$b) = $img->rgb($idx);
my $lum = 0.3 * $r + 0.59 * $g + 0.11 * $b;
print "($cx,$cy)\t$idx $r $g $b $lum\n" if $debug;
#
# la idea es acumular y luego sacar un promedio
#
$i++;
$bri += $lum;
}
}
# aca sacamos la luminancia promedio
$sb = int($bri / $i);
# imprimimos los caracteres de acuerdo a esa luminancia
if ($sb < 25) { print '#' }
elsif ($sb < 50) { print '@' }
elsif ($sb < 75) { print '0' }
elsif ($sb < 100) { print '$' }
elsif ($sb < 125) { print '&' }
elsif ($sb < 150) { print '¤' }
elsif ($sb < 175) { print '~' }
elsif ($sb < 200) { print '·' }
elsif ($sb < 225) { print '¨' }
elsif ($sb < 250) { print '´' }
else { print ' ' }
}
print "\n";
}