PHP 中颜色之间的“距离”

2022-08-31 00:04:44

我正在寻找一个函数,可以准确地将两种颜色之间的距离表示为数字或其他东西。

例如,我希望有一个十六进制值或RGB数组的数组,并且我想在给定颜色的数组中找到最相似的颜色

例如。我向一个函数传递一个RGB值,并返回数组中“最接近”的颜色


答案 1

每种颜色在十六进制代码中都表示为一个元组。要确定紧密匹配项,您需要分别减去每个 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) ;

}

答案 2

这是一篇关于这个主题的论文,应该给出一个很好的答案。

我以为首先转换为HSL / HSV也是一个好主意,但后来我意识到,在S &L / V的极端值下,H并不重要,在中间,它最重要。

我认为如果你想要一个简单的解决方案,留在RGB空间会更明智。我会使用笛卡尔距离。如果你正在考虑颜色反对几个,你希望最小化R G BRi Gi Biii

(R - Ri)^2 + (G - Gi)^2 + (B - Bi)^2

推荐