Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Image to table converter

by bastard (Hermit)
on Sep 30, 2000 at 08:11 UTC ( #34725=sourcecode: print w/replies, xml ) Need Help??
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: $

# 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 }<


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

                # 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
        $results .= "</TR>\n";
$results .= "</TABLE>";

print "$results\n";
Replies are listed 'Best First'.
Re: Image to table converter
by jerrygarciuh (Curate) on Sep 15, 2002 at 18:20 UTC
    Thanks for posting this. One comment though...the GD::Image->new() method expects numeric dimensions as args for a brand new image. Your code worked nicely when I changed line 9 to

    my $image = GD::Image->newFromJpeg($imagename) || die "Could not open image: $imagename\n";

    "The man who grasps principles can successfully select his own methods.
    The man who tries methods, ignoring principles, is sure to have trouble.
    ~ Ralph Waldo Emerson

RE: Image to table converter
by merlyn (Sage) on Sep 30, 2000 at 08:19 UTC
A reply falls below the community's threshold of quality. You may see it by logging in.
Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: sourcecode [id://34725]
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (4)
As of 2020-09-19 09:50 GMT
Find Nodes?
    Voting Booth?
    If at first I donít succeed, I Ö

    Results (114 votes). Check out past polls.