http://qs321.pair.com?node_id=34725
Category: HTML Utility
Author/Contact Info bastard
Description: I hacked this thing together during my quest to get around the "no images on the home node under level 5" rule. (yes i know there are other ways) I'm not sure how useful it is, but since someone requested it i'll post it here in case anyone else is interested. (I suppose the code could also provide a simple example of the use of the GD image module.)

What does it do you may ask? Basically it converts an image to a relatively optimized table representation of the image. It accepts one parameter which is the image file you are going to convert. It dumps the table to STDOUT. It can accept the following image types: PNG, JPEG, XPM and GD2

Warning, this will create very large and complex tables. I have created a 120k table from 6k PNG image, so this thing is not appropriate for larger images. (before the COLSPAN enhancements it could generate tables many times larger)

#!/usr/bin/perl -w

use strict;
use GD;        # this lib is so cool

my $imagename = shift;

# get the user specified image
my $image = GD::Image->new($imagename) || die "Could not open image: $
+imagename\n";

# get the image size
my ($width, $height) = $image->getBounds();

# build the seed color...
my $index = $image->getPixel(0, 0);
my ($r,$g,$b) = $image->rgb($index);

# now format it as 2 digit hex
my $color = sprintf "%02x%02x%02x", $r, $g, $b;

my $lastcolor = "";
my $count;

# the stylesheet is necessary to make the end result acceptably small
my $results = "<STYLE>.sm { font-size: 2px; font-family: sans-serif }<
+/STYLE>\n";

$results .= "<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=$width 
+HEIGHT=$height>";

# loop through the pixels
for (my $x = 0; $x < $height; $x++) {
        $count = 0;
        $results .= "<TR>";
        for (my $y = 0; $y < $width; $y++) {
                $count++;

                # get the color of the current pixel
                $index = $image->getPixel($y, $x);
                ($r,$g,$b) = $image->rgb($index);
                $color = sprintf "%02x%02x%02x", $r, $g, $b;

                # we use this to build a COLSPAN length
                # this greatly enhances efficiency
                if ($color ne $lastcolor) {
                        $count = $count * 2;
                        $results .= "<TD CLASS=sm BGCOLOR=\"$lastcolor
+\" COLSPAN=$count>_</TD>";
                        $count = 0;
                }

                $lastcolor = $color;
        }
        $count = $count * 2;
        $results .= "<TD CLASS=sm BGCOLOR=\"$lastcolor\" COLSPAN=$coun
+t>_</TD>";
        $results .= "</TR>\n";
}
$results .= "</TABLE>";

print "$results\n";