我想没有人知道可以采用十六进制颜色代码并为该十六进制值提供近似颜色名称的函数(最好是 PHP)。我不需要有 100 种颜色的解决方案。即使只有白色、黑色、红色、绿色蓝色、棕色橙色和黄色,我的身材也很好。
如果您不知道现有资源,有人知道解决此问题的好方法吗?
在此先感谢您的帮助。
最佳答案
你有一个颜色列表 here in wikipedia .
一个天真的实现只会计算你想要检索其名称的颜色与每一个颜色之间的距离,并输出更接近的那个。
如果您将颜色视为 R3 中的向量,则可以将距离计算为 L1 范数:
function distancel1(array $color1, array $color2) {
return abs($color1[0] - $color2[0]) +
abs($color1[1] - $color2[1]) +
abs($color1[2] - $color2[2]);
}
或 L2 规范:
function distancel2(array $color1, array $color2) {
return sqrt(pow($color1[0] - $color2[0], 2) +
pow($color1[1] - $color2[1], 2) +
pow($color1[2] - $color2[2], 2));
}
要转换十六进制表示法,请参阅 here .
示例脚本:
<?php
$colors = array(
"black" => array(0, 0, 0),
"green" => array(0, 128, 0),
"silver" => array(192, 192, 192),
"lime" => array(0, 255, 0),
"gray" => array(128, 0, 128),
"olive" => array(128, 128, 0),
"white" => array(255, 255, 255),
"yellow" => array(255, 255, 0),
"maroon" => array(128, 0, 0),
"navy" => array(0, 0, 128),
"red" => array(255, 0, 0),
"blue" => array(0, 0, 255),
"purple" => array(128, 0, 128),
"teal" => array(0, 128, 128),
"fuchsia" => array(255, 0, 255),
"aqua" => array(0, 255, 255),
);
$value = "#819001";
function html2rgb($color)
{
if ($color[0] == '#')
$color = substr($color, 1);
if (strlen($color) == 6)
list($r, $g, $b) = array($color[0].$color[1],
$color[2].$color[3],
$color[4].$color[5]);
elseif (strlen($color) == 3)
list($r, $g, $b) = array($color[0].$color[0],
$color[1].$color[1], $color[2].$color[2]);
else
return false;
$r = hexdec($r); $g = hexdec($g); $b = hexdec($b);
return array($r, $g, $b);
}
function distancel2(array $color1, array $color2) {
return sqrt(pow($color1[0] - $color2[0], 2) +
pow($color1[1] - $color2[1], 2) +
pow($color1[2] - $color2[2], 2));
}
$distances = array();
$val = html2rgb($value);
foreach ($colors as $name => $c) {
$distances[$name] = distancel2($c, $val);
}
$mincolor = "";
$minval = pow(2, 30); /*big value*/
foreach ($distances as $k => $v) {
if ($v < $minval) {
$minval = $v;
$mincolor = $k;
}
}
echo "Closest color: $mincolor\n";
关于php - 将十六进制颜色值转换为近似颜色名称的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2993970/