Php 将十六进制/hsl值映射到颜色范围

Php 将十六进制/hsl值映射到颜色范围,php,hex,rgb,hsl,Php,Hex,Rgb,Hsl,给定一个十六进制/rgb/hsl值,我如何将该值调整到例如11种基本颜色(如红色、蓝色等)的自定义范围内 我能做的最好的事情就是用眼睛匹配hsl中的色调范围,但是饱和度和亮度可以改变感知的颜色 我正在寻找一种算法,使所述值在一个颜色范围内匹配。如果你只说11种基本颜色(如红色、橙色、黄色、绿色、青色、蓝色、紫色、品红、黑色、白色、灰色),我会说你已经做到了。色调匹配是所有你需要匹配的颜色本身,只要他们在一个合理的范围内的S和L 在我看来,任何大于95英寸的L接近白色,任何小于5英寸的L接近黑色

给定一个十六进制/rgb/hsl值,我如何将该值调整到例如11种基本颜色(如红色、蓝色等)的自定义范围内

我能做的最好的事情就是用眼睛匹配hsl中的色调范围,但是饱和度和亮度可以改变感知的颜色


我正在寻找一种算法,使所述值在一个颜色范围内匹配。

如果你只说11种基本颜色(如红色、橙色、黄色、绿色、青色、蓝色、紫色、品红、黑色、白色、灰色),我会说你已经做到了。色调匹配是所有你需要匹配的颜色本身,只要他们在一个合理的范围内的S和L

在我看来,任何大于95英寸的L接近白色,任何小于5英寸的L接近黑色

如果你的S小于10,你的选项是黑色、灰色和白色,这取决于L,你甚至可以使用相同的规则。黑色=95,否则为灰色

为了匹配色调,使用我的示例颜色列表,您不能真正使用统一的范围,因为光谱红色端的颜色差异比青色端的颜色差异小得多。您可以手动定义它们,也可以使用逻辑函数获得相当好的结果


TL:DR;数学方面的东西,可能有点过头了。 我只想看一下色调,因为为它制作一个公式是不必要和复杂的

说到这里,我尝试了一个逻辑函数,它与普通颜色的感知相匹配

可以根据需要调整k值。我认为1.1给出了一个合理的价差(尽管我只尝试了几个值)。8给出了希望从此函数中获取的值的数量。因此,由于我们有8种不同的颜色,我们试图匹配(除了黑色、白色和灰色),我使用了8

3将域向右移动3个单位。我使用了3,因为它是我们将用于此函数的域的一半(中点两侧各有3个单元)

澄清一下,这是最后一个功能:

对于x,这个公式被调整为最小值为0,最大值为6,它将从青色开始。因此,如果
0=95)
返回“白色”;

else if($l)嗯,这只是一个非常一般的想法:如果通道值
50
(RGB或其他格式)在
0-255
的范围内,这个值是整个范围的
0.1961
。你也可以组合所有通道得到这样的值。现在想象一下,你将基本颜色映射到
0
1
之间的范围,你可以将
0.1961
映射到其中一种颜色。是的,这几乎就是我想要的id,一个色调值的硬编码列表和一些边缘情况,在这些情况下,L开始发挥作用,比如棕色和绿色,从黄色到低L。非常感谢David,你在回答中做了一些工作
function hsl($h, $s, $l){
    $options = array("cyan", "blue", "purple", "magenta", "red", "orange", "yellow", "green");
    if($l >= 95)
        return "white";
    else if($l <= 5)
        return "black";
    else if($s <= 10)
        return "gray";

    //Convert hue to x value
    $x = (($h + 210) % 360) / 60.0;
    $match = matchHue($x);
    return $options[$match];
}

function matchHue($x){
    return intval(floor(8 / (1 + pow(M_E, (-1.1 * ($x - 3))))));
}