有没有一种简单的方法可以将给定的十六进制颜色代码分配给更一般的类别(红色,绿色,蓝色,黄色,橙色,粉色,黑色,白色,灰色等)?例如:#ffcc55->橙色,#f0f0f0->白色...或者类似于Adobe Photoshop找到最近的Web安全颜色,从而将颜色数量减少到256,这已经是一个很好的解决方案了!请注意保留HTML标记。
<?php
function color_mkwebsafe ( $in )
{
// put values into an easy-to-use array
$vals['r'] = hexdec( substr($in, 0, 2) );
$vals['g'] = hexdec( substr($in, 2, 2) );
$vals['b'] = hexdec( substr($in, 4, 2) );
// loop through
foreach( $vals as $val )
{
// convert value
$val = ( round($val/51) * 51 );
// convert to HEX
$out .= str_pad(dechex($val), 2, '0', STR_PAD_LEFT);
}
return $out;
}
?>
我不是php专家,所以可能有更有效的解决方法,但我会将每种颜色设置为一个数组,因此每个颜色类别都有3个数字。然后找到您提议的颜色与其他颜色之间的数学距离。保存最接近的匹配并返回其名称。
function getcolorname($mycolor) {
// mycolor should be a 3 element array with the r,g,b values
// as ints between 0 and 255.
$colors = array(
"red" =>array(255,0,0),
"yellow" =>array(255,255,0),
"green" =>array(0,255,0),
"cyan" =>array(0,255,255),
"blue" =>array(0,0,255),
"magenta" =>array(255,0,255),
"white" =>array(255,255,255),
"grey" =>array(127,127,127),
"black" =>array(0,0,0)
);
$tmpdist = 255*3;
$tmpname = "none";
foreach($colors as $colorname => $colorset) {
$r_dist = (pow($mycolor[0],2) - pow($colorset[0],2));
$g_dist = (pow($mycolor[1],2) - pow($colorset[1],2));
$b_dist = (pow($mycolor[2],2) - pow($colorset[2],2));
$totaldist = sqrt($r_dist + $g_dist + $b_dist);
if ($totaldist < $tmpdist) {
$tmpname = $colorname;
$tmpdist = $totaldist;
}
}
return $tmpname;
}