计算colordifference

Ben*_*Ben 5 php

是否可以根据定义的"中心值"检查某个十六进制颜色是否接近FFF或000?

我想根据#888检查颜色是否接近#FFF或#000.因此,如果我检查#EFEFEF,它应该返回#FFF,如果我尝试#878787它应该返回#000.

怎么能实现这一目标?我不确定在Google上搜索什么...

提前致谢

rek*_*o_t 2

解决问题的最简单方法是使用颜色的灰度值计算颜色之间的距离(还有其他方法,但这很简单)。所以像这样:

// returns a distance between two colors by comparing each component
// using average of the RGB components, eg. a grayscale value
function color_distance($a, $b)
{
    $decA = hexdec(substr($a, 1));
    $decB = hexdec(substr($a, 1));
    $avgA = (($decA & 0xFF) + (($decA >> 8) & 0xFF) + (($decA >> 16) & 0xFF)) / 3;
    $avgB = (($decB & 0xFF) + (($decB >> 8) & 0xFF) + (($decB >> 16) & 0xFF)) / 3;
    return abs($avgA - $avgB);
}

// I am going to leave the naming of the function to you ;)
// How this works is that it'll return $minColor if $color is closer to $refColorMin
// and $maxColor if $color is closer to $refColorMax
// all colors should be passed in format #RRGGBB
function foo($color, $refColorMin, $refColorMax, $minColor, $maxColor)
{
    $distMin = color_distance($color, $refColorMin);
    $distMax = color_distance($color, $refColorMax);
    return ($distMin < $distMax) ? $minColor : $maxColor;
}

// Example usage to answer your original question:
$colorA = foo('#EFEFEF', '#888888', '#FFFFFF', '#000000', '#FFFFFF');
$colorA = foo('#898989', '#888888', '#FFFFFF', '#000000', '#FFFFFF');
// Check the values
var_dump($colorA, $colorB);
Run Code Online (Sandbox Code Playgroud)

输出是:

string(7) "#FFFFFF"
string(7) "#000000"
Run Code Online (Sandbox Code Playgroud)