#!/usr/bin/perl use GD; use strict; #use warnings; my $image_file = $ARGV[0]; open FILE, "<$image_file"; my $image_data = join '', ; close FILE; my $image = GD::Image->newFromPngData($image_data) or die; my ($width,$height) = $image->getBounds() or die; print STDERR "$width x $height\n"; #$image->trueColorToPalette(1, 256); print ''; print "Browser Stress Test

Browser Stress Test

"; print "The original image:
"; print "\"Image\"

"; print "The same image, rendered as an html table:
"; print ""; my @grid;# = ([(0) x ($width)]) x ($height); for my $y ( 0 .. $height -1 ) { my $rowstring = ''; INNER: for my $x ( 0 .. $width -1 ) { if($grid[$x][$y] < 1) { my ($rec_width, $rec_height) = &findRecSimple($x, $y, $width, $height, $image); #@grid = &colorGrid($x, $y, $x + $rec_width -1, $y + $rec_height -1, @grid); &colorGridInPlace($x, $y, $x + $rec_width -1, $y + $rec_height -1, \@grid); my $col_string = &getColorString($x,$y, $image); my $tmpString = ""; #$rowstring .= ""; $rowstring .= $tmpString; } else { next INNER; } } if($rowstring ne '') { print "$rowstring"; $rowstring = ''; } else { print ""; } } print "
1) { $tmpString .= "colspan=$rec_width "; } $tmpString .= "height=$rec_height "; if($rec_height > 1) { $tmpString .= "rowspan=$rec_height "; } $tmpString .= "bgcolor=\"$col_string\" >
"; sub printGrid { my ($width, $height, @grid) = @_; print "
\n";
  for my $y ( 0 .. $height -1 )
  {
    for my $x ( 0 .. $width -1 )
    {
      printf("%3d ", $grid[$x][$y]);
    }
    print "\n";
  }
  print "
"; } #{ # my $current = 0; sub colorGrid { my ($startx, $starty, $endx, $endy, @grid) = @_; #$current++; for my $y ( $starty .. $endy ) { for my $x ($startx .. $endx ) { #$grid[$x][$y] = $current; $grid[$x][$y] = 1; } } return @grid; } #} sub colorGridInPlace { my ($startx, $starty, $endx, $endy, $grid) = @_; #$current++; for my $y ( $starty .. $endy ) { for my $x ($startx .. $endx ) { #$grid[$x][$y] = $current; $grid->[$x][$y] = 1; } } #return @grid; } sub findRecSimple { my ($startx, $starty, $width, $height, $image) = @_; #my $rec_color = &getColorString($startx, $starty, $image); my $rec_color = $image->getPixel($startx, $starty); my $rec_width = &getRun($startx, $starty, $width, $image); my $rec_height = 1; for my $i ( $starty + 1 .. $height -1 ) { my $len = &getRun($startx, $i, $startx + $rec_width, $image); #my $col = &getColorString($startx, $i, $image); my $col = $image->getPixel($startx, $i); if($len >= $rec_width && $col == $rec_color) { $rec_height++; } else { last; } } return ($rec_width, $rec_height); } sub getRun { my ($startx, $y, $width, $image) = @_; my $length = 1; #my $base_color = getColorString($startx,$y, $image); my $base_color = $image->getPixel($startx,$y); for my $i ( $startx + 1 .. $width -1 ) { #my $pix = getColorString($i,$y, $image); my $pix = $image->getPixel($i,$y); if($pix == $base_color) { $length++; } else { last; } } return $length; } sub getColorString { my ($x, $y, $image) = @_; return sprintf("#%02X%02X%02X", $image->rgb($image->getPixel($x,$y))); }