It seems that imagecolorresolve is adding the colors to the palette when it can't find them!
imagecolorresolve
(PHP 4, PHP 5)
imagecolorresolve — Obtener el índice del color especificado o su alternativa más próxima posible
Descripción
$image
, int $red
, int $green
, int $blue
)Está función garantiza la devolución de un índice de color para un color requerido, el color exacto o la alternativa más próxima posible.
Si se ha creado la imagen a partir de un fichero, sólo se resolverán los colores utilizados en la imagen. No se resolverán los colores que sólo están presentes en la paleta.
Parámetros
-
image -
Un recurso image, es devuelto por una de las funciones de creación de imágenes, como imagecreatetruecolor().
-
red -
Valor del componente rojo.
-
green -
Valor del componente verde.
-
blue -
Valor del componente azul.
Valores devueltos
Devuelve un índice de color.
Ejemplos
Ejemplo #1 Usar imagecoloresolve() para obtener colores de una imagen
<?php
// Cargar un imagen
$im = imagecreatefromgif('phplogo.gif');
// Obtener los colores más próximos de la imagen
$colores = array();
$colores[] = imagecolorresolve($im, 255, 255, 255);
$colores[] = imagecolorresolve($im, 0, 0, 200);
// Imprimir
print_r($colores);
imagedestroy($im);
?>
El resultado del ejemplo sería algo similar a:
Array
(
[0] => 89
[1] => 85
)
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);
}
