Welcome to WebmasterWorld Guest from 107.20.54.98

Forum Moderators: coopster & jatar k

Message Too Old, No Replies

GD color limit is too low

     
10:11 pm on Apr 3, 2011 (gmt 0)

Junior Member

5+ Year Member

joined:July 30, 2009
posts: 130
votes: 0


I just started learning about the GD library and made a small script to test a few features. I quickly found out that I was limited to 256 colors, but that creating the image with imagecreatetruecolor() instead of imagecreate() all but eliminates the issue. However, after a few modifications I saw the 256 color limit reappear, even though I am still using imagecreatetruecolor(). What is causing this and how do I fix it?

Here's my testing / playing around script. You'll notice that if you set the number of line segments (for loop's upper bound) to greater than 256 the line appears increasingly disjointed. This is because the rest of the line in being drawn in the background color, black.

<?php
$s=500;
$im=imagecreatetruecolor($s,$s);
$tmp=rand(1,$s-1);
$x=rand(0,1)?(rand(0,1)?0:$s-1):$tmp;
$y=$x&&$x<$s-1?(rand(0,1)?0:$s-1):$tmp;
$vx=0;
$vy=0;
for($i=0;$i<1000;$i++) {
$_x=$x;
$_y=$y;
$x=$x+(rand(0,1)?1:-1)+$vx;
$y=$y+(rand(0,1)?1:-1)+$vy;
if($x<0) {
$x=0;
$vx=-$vx;
}
if($x>=$s) {
$x=$s-1;
$vx=-$vx;
}
if($y<0) {
$y=0;
$vy=-$vy;
}
if($y>=$s) {
$y=$s-1;
$vy=-$vy;
}
$vx=$vx*.8+($x-$_x)*.2;
$vy=$vy*.8+($y-$_y)*.2;
$c=imagecolorallocate($im,0,(255-$i)%255,$i%255);
imageline($im,$_x,$_y,$x,$y,$c);
}
imagefilter($im,IMG_FILTER_GAUSSIAN_BLUR);
header('Content-type:image/png;');
imagepng($im);
imagedestroy($im);
?>
4:28 pm on Apr 28, 2011 (gmt 0)

Administrator

WebmasterWorld Administrator coopster is a WebmasterWorld Top Contributor of All Time 10+ Year Member

joined:July 31, 2003
posts:12533
votes: 0


The RGB components cannot go beyond that value:

These parameters are integers between 0 and 255 or hexadecimals between 0x00 and 0xFF.


[php.net...]
9:59 pm on Apr 28, 2011 (gmt 0)

Preferred Member

10+ Year Member

joined:Feb 11, 2006
posts:481
votes: 0


Hi,

Your script is, in some instances, calling
imagecolorallocate
with the third argument (green) as a negative number, this causes
imagecolorallocate
to return false, which
imageline
is interpreting as black.
Also you're always setting the red argument to 0 which will limit you range of colours.

Andrew
7:36 pm on Apr 29, 2011 (gmt 0)

Junior Member

5+ Year Member

joined:July 30, 2009
posts: 130
votes: 0


Well that's embarrassing. Thanks for your replies though, and hopefully next time I'll wait a little longer before asking for help.
9:28 pm on Apr 29, 2011 (gmt 0)

Preferred Member

10+ Year Member

joined:Feb 11, 2006
posts:481
votes: 0


Don't worry can't-see-the-wood-for-the-trees syndrome is common amongst programmers, I know because I sometimes struggle with the condition myself.

Andrew