参考

User Contributed Notes 21 notes

Note that you can only assign 255 colors to any image palette. If you try assigning more, imagecolorallocate() will fail.

If, for example, you are randomly allocating colors, it will be wise to check if you have used up all of the colors possible. You can use imagecolorclosest() to get the closest assigned color:<?php//assign random rgb values$c1 = mt_rand(50,200); //r(ed)$c2 = mt_rand(50,200); //g(reen)$c3 = mt_rand(50,200); //b(lue) //test if we have used up paletteif(imagecolorstotal($pic)>=255) {//palette used up; pick closest assigned color$color = imagecolorclosest($pic, $c1, $c2, $c3); } else {//palette NOT used up; assign new color$color = imagecolorallocate($pic, $c1, $c2, $c3); }?>

Also, imagecolorallocate() will assign a new color EVERY time the function is called, even if the color already exists in the palette:<?php// [...]imagecolorallocate($pic,125,125,125); //returns 5imagecolorallocate($pic,125,125,125); //returns 6imagecolorallocate($pic,125,125,125); //returns 7 // [...]imagecolorallocate($pic,125,125,125); //returns 23imagecolorallocate($pic,125,125,125); //returns 25 // [...] // etc...?>

When working on an existant GIF images, if the number of different colours has reached the limits of the GIF format, imagecolorallocate will not use to the colour you ask her within the parameters, she will apply black !

That's a problem when generating images "on-the-fly" with many manipulations, from a GIF image.To go round the problem, you have to convert the GIF image into a PNG one, and then you can work on the PNG and everything will be ok.

When you are using truecolor images, you can also use bitwise operations to generate the color:<?php$color = ($r << 16) | ($g << 8) | $b; // 2261213?>This is identical to the imagecolorallocate() function, in truecolor images!

I was unable to get any of the posted methods for converting colour to grayscale to work. The problem appears to be the way gd creates images from jpeg inconsistently over various versions. Eventually I wrote my own that works for me - this approach allocates the 256 color pallete first. You can also play with separate $r, $g, $b variables before using imagecolorallocate in order to tone or tint the image.