zentara has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I wrote a little script using GD to "slice and dice" an image and make it a clickable html image map. It all works good, except for some pallette problems, which can be seen here. I've tried using png instead of jpg, and got the same results. A little web searching says to use gif's as your original file format, to get better palettes, but GD dosn't support gif. The problem is that the "truecolor=1" setting gives a faithful copy, but with some bad tiles. Where "truecolor=0" gives uniform results, but somewhat dergaded. Any ideas to solve this?
#!/usr/bin/perl use warnings; use strict; use GD; my @tiles = (); my $file = shift or die "need filename\n"; my $tempname = $file; $tempname =~ s/^(.+)(\.\w+)$/$1/; print "$tempname\n"; #set tile size my $x = 100; my $y = 100; #truecolor with 1 instead of 0, looks better #but some tile pallettes might get screwed up #safer with 0 my $image = GD::Image->newFromJpeg($file,0); my ($width,$height) = $image->getBounds(); print "width->$width height->$height\n"; #$image->trueColorToPalette(); #dosn't help much #you can experiment my $rows = int($height/$y +1) - 1; #make it 0 based my $cols = int($width/$x + 1) - 1; print "rows->$rows cols->$cols\n"; foreach my $row(0..$rows){ foreach my $col(0..$cols){ my $imageout = new GD::Image($x,$y); #$image->copy($sourceImage,$dstX,$dstY, # $srcX,$srcY,$width,$height) $imageout->copy($image,0,0,($col*$y),($row*$x),$x,$y); my $tilename = $tempname .'-'.$row.'-'.$col.'.jpg'; push(@tiles,$tilename); open(OUT, '>', $tilename) or warn $!; print OUT $imageout->jpeg; close OUT; } } ###################################################################### + #make an html page with tiles reassembled and clickable open(HT,">$tempname-jpg.html") or warn $!; print HT "<html><body><h1>$tempname.jpg</h1>"; print HT "<table border=0 cellspacing=0 cellpadding=0>"; #putting border=0 in the IMG<> makes it seamless #I have border=1 for demonstration foreach my $row(0..$rows){ print HT "<tr>"; foreach my $col(0..$cols){ print HT "<td><a href= $tempname-$row-$col.html> <IMG SRC=$tempname-$row-$col.jpg border=1 HEIGHT=$y + WIDTH=$x alt=$tempname-$row-$col.jpg></a></td>" } print HT "</tr>"; } print HT "</table></body></html>";

Replies are listed 'Best First'.
Re: pallette problems with GD slicing images
by zentara (Cardinal) on Nov 29, 2003 at 21:48 UTC
    Well I found that Imager works better for this. Imager uses a "crop" to get tiles, whereas GD uses a copy. I put my Imager script in the Snippets section, if you are interested.
Re: palette problems with GD slicing images
by Dr. Mu (Hermit) on Dec 01, 2003 at 02:48 UTC
    Why do you need to dice up the image in the first place? The HTML <map> and <area> tags let you assign different actions or hrefs to different regions within a single image. (Ref: W3C.)
      Good point. I guess there would be some other uses for it, for instance....if you have a huge image to download, and you want the client to "get something right away", instead of having to wait for the entire image to arrive. Or maybe there could be some "watermarking uses", where you could put small different watermarks in each tile image. Or maybe use it as a "Concentration" style game, where you display what's behind each tile, 1 tile at a time.

      Who knows? I saw this question asked on the perl.beginners maillist, and I thought it was something I would like to have in my toolbox.