It seems that imagecolorresolve is adding the colors to the palette when it can't find them!
imagecolorresolve
(PHP 4, PHP 5)
imagecolorresolve — Get the index of the specified color or its closest possible alternative
Descrierea
int imagecolorresolve
( resource
$image
, int $red
, int $green
, int $blue
)This function is guaranteed to return a color index for a requested color, either the exact color or the closest possible alternative.
Dacă ați creat imaginea din fișier atunci sunt determinate doar culorile utilizate în imagine. Culorile prezente doar în paletă nu sunt determinate.
Parametri
-
image -
O resursă - imagine, întoarsă de una din funcțiile de creare a imaginilor, cum ar fi imagecreatetruecolor().
-
red -
Valoarea componentei roșii.
-
green -
Valoarea componentei verzi.
-
blue -
Valoarea componentei albastre.
Valorile întoarse
Returns a color index.
Exemple
Example #1 Using imagecoloresolve() to get colors from an image
<?php
// Load an image
$im = imagecreatefromgif('phplogo.gif');
// Get closest colors from the image
$colors = array();
$colors[] = imagecolorresolve($im, 255, 255, 255);
$colors[] = imagecolorresolve($im, 0, 0, 200);
// Output
print_r($colors);
imagedestroy($im);
?>
Exemplul de mai sus va afișa ceva similar cu:
Array
(
[0] => 89
[1] => 85
)
tom
20-Apr-2012 04:08
ceo at l-i-e dot com
02-Jan-2002 08: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);
}
