#!/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"; }