将十六进制颜色分类为红色、绿色、蓝色、黄色和橙色。

7
有没有一种简单的方法可以将给定的十六进制颜色代码分配给更一般的类别(红色,绿色,蓝色,黄色,橙色,粉色,黑色,白色,灰色等)?例如:#ffcc55->橙色,#f0f0f0->白色...或者类似于Adobe Photoshop找到最近的Web安全颜色,从而将颜色数量减少到256,这已经是一个很好的解决方案了!请注意保留HTML标记。

1
咳咳...找到最近的颜色可以很容易地完成,我认为,特别是如果您已经准备好了Web安全颜色RGB值表。只需计算差异(记住它是十六进制),然后选择具有最低差异的颜色即可。 - raina77ow
2个回答

5
这段内容来自http://php.net/manual/en/function.dechex.php,评论来自 lavacube.com 上的 cory:

<?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;
}

?>

示例:color_mkwebsafe('0e5c94'); 生成结果:006699

4

我不是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;
}

啊 - 我可能误解了问题 - 我以为目标是从十六进制值映射到字符串描述,而不是从十六进制值映射到一组类似的十六进制值之一。 - Nato Saichek
没问题,非常感谢你的帮助!! :) 顺便说一下,无论我尝试哪种颜色,你的函数总是返回红色? :) - Chris
酷,列表的顺序重要吗(数组)?如果您想添加新的颜色范围,例如橙色,该怎么办? - Chris
列表的顺序并不重要,但随着列表变得越来越长,它会变得不那么高效...我可能在这里做了太多的数学运算。可能有更好的算法。如果你只是为自己或一小群用户做这个,那就没问题。但如果你想让百万人运行这个程序,它可能会有点吃力。 - Nato Saichek
可能存在错误,因为如果您尝试使用颜色:#92D050(这是绿色),则红色=> 146,绿色=> 208和蓝色=> 80。您可以看到与红色的距离为负数。根据值的不同,您可能会得到负数的平方根,从而导致NAN值并且您会得到奇怪的结果。例如,#92D050是绿色,这是不正确的。 - Pons
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接