PHP 中颜色之间的“距离”
我正在寻找一个函数,可以准确地将两种颜色之间的距离表示为数字或其他东西。
例如,我希望有一个十六进制值或RGB数组的数组,并且我想在给定颜色的数组中找到最相似的颜色
例如。我向一个函数传递一个RGB值,并返回数组中“最接近”的颜色
我正在寻找一个函数,可以准确地将两种颜色之间的距离表示为数字或其他东西。
例如,我希望有一个十六进制值或RGB数组的数组,并且我想在给定颜色的数组中找到最相似的颜色
例如。我向一个函数传递一个RGB值,并返回数组中“最接近”的颜色
每种颜色在十六进制代码中都表示为一个元组。要确定紧密匹配项,您需要分别减去每个 RGB 分量。
例:
Color 1: #112233
Color 2: #122334
Color 3: #000000
Difference between color1 and color2: R=1, G=1 B=1 = 0x3
Difference between color3 and color1: R=11, G=22, B=33 = 0x66
So color 1 and color 2 are closer than
1 and 3.
编辑
所以你想要最接近的命名颜色?使用每种颜色的十六进制值创建一个数组,对其进行迭代并返回名称。像这样的东西;
function getColor($rgb)
{
// these are not the actual rgb values
$colors = array(BLUE =>0xFFEEBB, RED => 0x103ABD, GREEN => 0x123456);
$largestDiff = 0;
$closestColor = "";
foreach ($colors as $name => $rgbColor)
{
if (colorDiff($rgbColor,$rgb) > $largestDiff)
{
$largestDiff = colorDiff($rgbColor,$rgb);
$closestColor = $name;
}
}
return $closestColor;
}
function colorDiff($rgb1,$rgb2)
{
// do the math on each tuple
// could use bitwise operates more efficiently but just do strings for now.
$red1 = hexdec(substr($rgb1,0,2));
$green1 = hexdec(substr($rgb1,2,2));
$blue1 = hexdec(substr($rgb1,4,2));
$red2 = hexdec(substr($rgb2,0,2));
$green2 = hexdec(substr($rgb2,2,2));
$blue2 = hexdec(substr($rgb2,4,2));
return abs($red1 - $red2) + abs($green1 - $green2) + abs($blue1 - $blue2) ;
}
这是一篇关于这个主题的论文,应该给出一个很好的答案。
我以为首先转换为HSL / HSV也是一个好主意,但后来我意识到,在S &L / V的极端值下,H并不重要,在中间,它最重要。
我认为如果你想要一个简单的解决方案,留在RGB空间会更明智。我会使用笛卡尔距离。如果你正在考虑颜色反对几个,你希望最小化R G B
Ri Gi Bi
i
i
(R - Ri)^2 + (G - Gi)^2 + (B - Bi)^2