ceo at l-i-e dot com
03-Jan-2002 07:55
Okay, so sometimes it's really IMPORTANT to get the exact color you want,
only it's not *IN* the Image, and ImageColorResolve just isn't "close
enough".
The following code is a disgustingly gross hack,
rather slow, but it does that.
$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);
}