in reply to Re: Images created in a loop grow
in thread Images created in a loop grow

Thanks for the suggestions. I tried using undef $im but I still seem to have the problem. The following code builds 10 images. The first one has a white background and the rest all have black backgrounds. I am not sure why. I would expect them to all be the same. Any suggestions? Thanks again.

Here is the code

#!/usr/bin/perl use GD; $maxx = 600; $maxy = 500; for ($x = 0; $x < 10; $x++) { # create a new image undef $im; $im = new GD::Image($maxx+50,$maxy); $im->trueColor(1); # allocate some colors $white = $im->colorAllocate(255,255,255); $black = $im->colorAllocate(0,0,0); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,$maxx-1,$maxy-1,$black); $im->line(0, $maxy/2, $maxx, $maxy/2, $black); $png_data = $im->png; my $file = "TestImage". $x.".png"; open(DISPLAY,">$file") || die "open failed"; binmode DISPLAY; print DISPLAY $png_data; close DISPLAY; print "Output file = ".$file."\n"; undef $png_data; undef $im; }

Replies are listed 'Best First'.
Re^3: Images created in a loop grow
by zentara (Cardinal) on Apr 17, 2006 at 13:30 UTC
    Your example was a little tricky, because of the white transparency, and black rectangles, it all showed up as black on my screen....BUT I did find your problem. What I noticed was the first file was one third the file size of the subsequent files.

    Your problem is the truecolor setting. This isn't obvious, it's just that I've seen the question asked before, and had the answer handy. Just look at it as a recipe.

    The truecolor spec is a global in the c library, and should be set the way I've shown below. What was happening in your script, (I think :-) )was the truecolor was only being set after the first run through, thus the first file was different. I said GD can be tricky sometimes. :-) Try this

    #!/usr/bin/perl use GD; GD::Image->trueColor(1); $maxx = 600; $maxy = 500; for ($x = 0; $x < 10; $x++) { # create a new image undef $im; $im = new GD::Image($maxx+50,$maxy); # not $im->trueColor(1); # allocate some colors $white = $im->colorAllocate(255,255,255); $black = $im->colorAllocate(0,0,0); # make the background transparent and interlaced $im->transparent($white); $im->interlaced('true'); # Put a black frame around the picture $im->rectangle(0,0,$maxx-1,$maxy-1,$black); $im->line(0, $maxy/2, $maxx, $maxy/2, $black); $png_data = $im->png; my $file = "TestImage". $x.".png"; open(DISPLAY,">$file") || die "open failed"; binmode DISPLAY; print DISPLAY $png_data; close DISPLAY; print "Output file = ".$file."\n"; undef $png_data; undef $im; }

    I'm not really a human, but I play one on earth. flash japh
      Thanks again for your help. Your solution did the trick!

      George