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