#!/usr/bin/perl -w use strict; use constant BLACK_THRESHOLD => 16; # Parse header. my ($magic, $size, $depth); defined($magic = <>) or die; defined($size = <>) or die; defined($depth = <>) or die; die unless $magic =~ /^P5/ && $depth =~ /^255/ && $size =~ /^(\d+) (\d+)/; my $width = $1; my $height = $2; # Output bytes. my $data = join '', <>; length($data) == $width * $height or die; for(my $y = 0; $y < $height; $y++) { foreach my $c (unpack 'C*', substr($data, $y * $width, $width)) { if( $c < BLACK_THRESHOLD ) { print " "; } else { my $level = int(25 * ($c - BLACK_THRESHOLD) / (255 - BLACK_THRESHOLD)); print chr(65 + $level); #print "X"; } } print "\n"; }