PHP 8.4.3 Released!

imagecolorclosesthwb

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

imagecolorclosesthwb Получает индекс цвета с заданными тоном, белизной и затемнением

Описание

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

Функция получает индекс цвета с наиболее близкими к заданному цвету значениями тона, белизны и затемнения.

Список параметров

image

Объект GdImage, который возвращает одна из функций, создающих изображения, например, imagecreatetruecolor().

red

Значение красного компонента цвета.

green

Значение зелёного компонента цвета.

blue

Значение синего компонента цвета.

Возвращаемые значения

Функци возвращает целочисленный индекс цвета с наиболее близкими к заданному цвету значениями тона, белизны и затемнения.

Список изменений

Версия Описание
8.0.0 Параметр image теперь ожидает экземпляр класса GdImage; раньше параметр ждал корректный gd-ресурс (resource).

Примеры

Пример #1 Пример получения индекса цвета функцией imagecolorclosesthwb()

<?php

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

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

?>

Вывод приведённого примера будет похож на:

HWB: 33

Смотрите также

Добавить

Примечания пользователей 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