From:             [EMAIL PROTECTED]
Operating system: Any
PHP version:      4.1.1
PHP Bug Type:     GD related
Bug description:  Feature Request: ImageColorLeastUsed

ImageColorResolve et al are really cool, but SOMETIMES you 
*need* the color you want, and they just won't cut it.

So you want to deallocate the least-used color, and then 
allocate the one you really want.

Alas, the only way to do that (as far as I can figger) is 
this:

$colorcount = array();
for ($x = 0; $x < $width; $x++){
        for ($y = 0; $y < $height; $y++){
                $colorindex = imagecolorat($jpg, $x, $y);
                if (!isset($colorcount[$colorindex])){
                        $colorcount[$colorindex] = 1;
                }
                else{
                        $colorcount[$colorindex]++;
                }
        }
}
asort($colorcount);
reset($colorcount);

$black = imagecolorexact($jpg, 0, 0, 0);
if ($black == -1){
        $goner = key($colorcount);
        $rgb = imagecolorsforindex($jpg, $goner);
        #error_log("Need black: About to kill $goner ($rgb[red], 
$rgb[green], $rgb[blue]) which was only used in 
$colorcount[$goner] pixels", 0);
        unset($colorcount[$goner]);
        imagecolordeallocate($jpg, $goner);
        $black = imagecolorallocate($jpg, 0, 0, 0);
}
if ($black == -1){
        $black = imagecolorresolve($jpg, 0, 0, 0);
        #error_log("Damn!  STILL couldn't allocate the color!", 
0);
}


Ugly, ain't it :-)

Anyway, if GD has any internal structures of a histogram 
nature, that one could use for a function matching this 
documentation:

int ImageColorLeastUsed(int img)
Returns a color index of the least-used color in the image.
Suitable for ImageDeallocate() when you really need a color 
that is not in the image.

Also handy would be something like:
array ImageColorMostContrasty(int img)
Returns an a array of 'red', 'green', 'blue' at a maxium 
distance from all other colors currently in the image.

I have no clue which color-distance algorithm I would 
actually want here.  But it would be nice for adding 
overlays to existing images that come from a random source.

If you want some idea of what I'm talking about:
http://chatmusic.com/maplocater.htm

The latitude/longitude lines and the red circles are being 
pulled from a database and overlaid in real-time.  However, 
somebody might upload a map with lots of red and black in 
it, and then I've got un-usable images.

-- 
Edit bug report at: http://bugs.php.net/?id=14820&edit=1


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to