【问题标题】:Categorize hex color into red, green, blue, yellow, orange,将十六进制颜色分类为红、绿、蓝、黄、橙、
【发布时间】:2012-09-18 23:40:05
【问题描述】:

有没有一种方法可以轻松地将给定的十六进制颜色代码分配给更通用的类别(红色、绿色、蓝色、黄色、橙色、粉色、黑色、白色、灰色……)?

#ffcc55 -> 橙色,#f0f0f0 -> 白色,...

编辑:甚至类似于 adobe photoshop 寻找最近的网络安全颜色,因此它将颜色数量减少到 256,这已经是一个很好的解决方案!

【问题讨论】:

  • 咳咳……我认为找到最接近的颜色可以很容易地完成,特别是如果您准备好网络安全颜色 RGB 值表只需计算差异(记住是十六进制),然后选择颜色最低的颜色。

标签: php colors hex


【解决方案1】:

来自http://php.net/manual/en/function.dechex.php,来自 lavacube dot 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

【讨论】:

    【解决方案2】:

    我不是 php 专家,所以在 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;
    }
    

    【讨论】:

    • 啊 - 我可能误解了这个问题 - 我认为目标是从十六进制值映射到字符串描述,而不是从十六进制值映射到类似十六进制值的子集之一。
    • 没问题,非常感谢您的帮助!! :) 顺便说一句,无论我尝试哪种颜色,你的函数总是为我返回红色? :)
    • 我刚刚编辑了它 - 我在总结时忘记了 'r_dist'、'g_dist' 和 'b_dist' 变量前面的 $。看起来它现在正在工作。
    • 酷,列表的顺序重要吗(数组)?如果您想添加新的颜色范围,例如橙色?
    • 列表的顺序无关紧要,但随着时间的推移,它的效率会降低一些......我可能在这里做的数学太多了。可能有更好的算法。如果您只是为自己或一小部分用户这样做,那可能没问题。如果你想让一百万人运行它,它可能会有点突兀。
    猜你喜欢
    • 2018-10-20
    • 2014-02-23
    • 2019-05-21
    • 2019-10-29
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多