#!/usr/bin/perl # call as ./png2ascii.pl /path/to/image.png use strict; use warnings; use GD; my @master_ascii = (qw(W M 0 @ N & ), ',', qw(' - . `), ' '); my $matrix = []; my $gdimg = GD::Image->newFromPng(shift @ARGV); my ($w, $h) = $gdimg->getBounds(); my $x = 0; while ($x < $w) { my $y = 0; while ($y < $h) { my $index = $gdimg->getPixel($x, $y); my ($r,$g,$b) = $gdimg->rgb($index); $matrix->[$y]->[$x] = ($r + $g + $b) / 3; $y++; } $x++; } my ($num, $den) = (2,3); my $blocksize = $den - $num + 1; my $skipblock = $den - $blocksize; my $matrix2 = []; my $m2line = 0; my $spacer = 0; foreach my $l (0..$#$matrix) { if ($spacer > $skipblock){ $spacer = ($spacer + 1) % $den; next; } $spacer = ($spacer + 1) % $den; my $m2pix = 0; my $line = $matrix->[$l]; foreach my $p (0..$#$line) { my $total = 0; foreach my $multiplier (0..$blocksize - 1) { $total += $matrix->[$l + $multiplier]->[$p] if defined $matrix->[$l + $multiplier]->[$p]; } my $m2value = int($total / $blocksize); $matrix2->[$m2line]->[$m2pix++] = $m2value; }; $m2line++; }; $matrix = $matrix2; foreach my $m (@$matrix) { foreach my $g (@$m) { my $idx = undef; #find out the ascii value we'll use. 0 is always our black, #255 is always our white if ($g == 0){ $idx = 0; } elsif ($g == 255){ $idx = $#master_ascii; } else { $idx = @master_ascii * $g / 256; }; print $master_ascii[$idx]; } print "\n"; }