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";
}