CascadiaPHP 2024

imagecolorclosesthwb

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagecolorclosesthwbObtém o índice da cor que tem a matiz, brancura e negritude mais próximas de uma cor informada

Descrição

imagecolorclosesthwb(
    GdImage $image,
    int $red,
    int $green,
    int $blue
): int

Obtém o índice da cor que tem a matiz, a brancura e a negritude mais próximas da cor informada.

Parâmetros

image

Um objeto GdImage, retornado por uma das funções de criação de imagem, como imagecreatetruecolor().

red

Valor do componente vermelho.

green

Valor do componente verde.

blue

Valor do componente azul.

Valor Retornado

Retorna um inteiro com o índice da cor que tem a matiz, a brancura e a negritude mais próxima da cor informada.

Registro de Alterações

Versão Descrição
8.0.0 O parâmetro image agora espera uma instância de GdImage; anteriormente, um resource gd válido era esperado.

Exemplos

Exemplo #1 Exemplo de uso de imagecolorclosesthwb()

<?php
$im
= imagecreatefromgif('php.gif');

echo
'HWB: ' . imagecolorclosesthwb($im, 116, 115, 152);

imagedestroy($im);
?>

O exemplo acima produzirá algo semelhante a:

HWB: 33

Veja Também

add a note

User Contributed Notes 1 note

up
7
Xong
15 years ago
I have written a function which uses the deltaE-function of the CMC.
It returns much better results than imagecolorclosestHWB() or imageColorClosest().

A test-script is online on http://www.fuhrpark-software.de/spielwiese/color.php?color=ffff00

<?php
/*
* Returns the index of the palette-color which is most similar
* to $givenColor.
*
* $givenColor and the colors in $palette should be either
* formatted as (#)rrggbb
* (e. g. "ff0000", "4da4f3" or "#b5d7f3")
* or arrays with values for red, green and blue
* (e. g. $givenColor = array( 0xff, 0x00, 0x00 ) )
*
* References:
* function rgb2lab
* - http://www.f4.fhtw-berlin.de/~barthel/ImageJ/ImageJ.htm
*
* function rgb2lab & function deltaE
* - http://www.brucelindbloom.com
*/
function getNearestColor(
$givenColor,
$palette = array( 'blue' => '43aafd','red' => 'fe6256','green' => '64b949','yellow' => 'fcf357',
'black' => '656565','white' => 'fdfdfd','orange' => 'fea800','purple' => '9773fe')
) {
if(!
function_exists('rgb2lab')) {
function
rgb2lab($rgb) {
$eps = 216/24389; $k = 24389/27;
// reference white D50
$xr = 0.964221; $yr = 1.0; $zr = 0.825211;

$rgb[0] = $rgb[0]/255; //R 0..1
$rgb[1] = $rgb[1]/255; //G 0..1
$rgb[2] = $rgb[2]/255; //B 0..1

// assuming sRGB (D65)
$rgb[0] = ($rgb[0] <= 0.04045)?($rgb[0]/12.92):pow(($rgb[0]+0.055)/1.055,2.4);
$rgb[1] = ($rgb[1] <= 0.04045)?($rgb[1]/12.92):pow(($rgb[1]+0.055)/1.055,2.4);
$rgb[2] = ($rgb[2] <= 0.04045)?($rgb[2]/12.92):pow(($rgb[2]+0.055)/1.055,2.4);

// sRGB D50
$x = 0.4360747*$rgb[0] + 0.3850649*$rgb[1] + 0.1430804 *$rgb[2];
$y = 0.2225045*$rgb[0] + 0.7168786*$rgb[1] + 0.0606169 *$rgb[2];
$z = 0.0139322*$rgb[0] + 0.0971045*$rgb[1] + 0.7141733 *$rgb[2];

$xr = $x/$xr; $yr = $y/$yr; $zr = $z/$zr;

$fx = ($xr > $eps)?pow($xr, 1/3):($fx = ($k * $xr + 16) / 116);
$fy = ($yr > $eps)?pow($yr, 1/3):($fy = ($k * $yr + 16) / 116);
$fz = ($zr > $eps)?pow($zr, 1/3):($fz = ($k * $zr + 16) / 116);

$lab = array();
$lab[] = round(( 116 * $fy ) - 16);
$lab[] = round(500*($fx-$fy));
$lab[] = round(200*($fy-$fz));
return
$lab;
}
}

if(!
function_exists('deltaE')) {
function
deltaE($lab1, $lab2) {
// CMC 1:1
$l = 1; $c = 1;

$c1 = sqrt($lab1[1]*$lab1[1]+$lab1[2]*$lab1[2]);
$c2 = sqrt($lab2[1]*$lab2[1]+$lab2[2]*$lab2[2]);

$h1 = (((180000000/M_PI) * atan2($lab1[1],$lab1[2]) + 360000000) % 360000000)/1000000;

$t = (164 <= $h1 AND $h1 <= 345)?(0.56 + abs(0.2 * cos($h1+168))):(0.36 + abs(0.4 * cos($h1+35)));
$f = sqrt(pow($c1,4)/(pow($c1,4) + 1900));

$sl = ($lab1[0] < 16)?(0.511):((0.040975*$lab1[0])/(1 + 0.01765*$lab1[0]));
$sc = (0.0638 * $c1)/(1 + 0.0131 * $c1) + 0.638;
$sh = $sc * ($f * $t + 1 -$f);

return
sqrt(
pow(($lab1[0]-$lab2[0])/($l * $sl),2) +
pow(($c1-$c2)/($c * $sc),2) +
pow(sqrt(
(
$lab1[1]-$lab2[1])*($lab1[1]-$lab2[1]) +
(
$lab1[2]-$lab2[2])*($lab1[2]-$lab2[2]) +
(
$c1-$c2)*($c1-$c2)
)/
$sh,2)
);
}
}

if(!
function_exists('str2rgb')) {
function
str2rgb($str)
{
$str = preg_replace('~[^0-9a-f]~','',$str);
$rgb = str_split($str,2);
for(
$i=0;$i<3;$i++)
$rgb[$i] = intval($rgb[$i],16);

return
$rgb;
}
}

$givenColorRGB = is_array($givenColor?$givenColor:str2rgb($givenColor);

$min = 0xffff;
$return = NULL;

foreach(
$palette as $key => $color) {
$color = is_array($color)?$color:str2rgb($color);
if(
$min >= ($deltaE = deltaE(rgb2lab($color),rgb2lab($givenColorRGB))))
{
$min = $deltaE;
$return = $key;
}
}

return
$return;
}
?>
To Top