从一组十六进制颜色中获取基色

时间:2012-12-19 02:18:54

标签: php colors

我有一组颜色,并希望将它们分解为10到20个基本颜色。

这不应该是传入的内容的托盘,而是与传入的内容无关。因此,如果使用的图像只是各种不同的红色,它将只返回红色,可能带有浅/深红色。

EG:我的颜色是下面的方框,输出的例子是线条。因此,从这21个颜色中,列表在此示例中降至8。

enter image description here

上面的十六进制值:

#000000
#ffffff
#003e9f
#d61517
#00a7bd
#001070
#a0210c
#dc9103
#e6151e
#fdfdfd
#011171
#fbfd10
#ffc500
#fdc605
#e6141d
#faf703
#544b20
#796a3a
#7a6b3a

最终输出可能类似于此色轮的外环enter image description here

2 个答案:

答案 0 :(得分:4)

提前选择base颜色并制作阵列 - 您可以使用色轮外环中的12。使用关联数组作为输出的集合:对于每种输入颜色,找到最接近的基色并将其作为键添加到输出数组。然后返回该数组的键。

要查找颜色距离,您可以将颜色视为三维空间中的点,(x,y,z)=(r,g,b),并使用欧几里德距离。从十六进制字符串中提取组件后,就像这样:

$dr = $r2 - $r1; 
$dg = $g2 - $g1; 
$db = $b2 - $b1; 
$dist = sqrt($dr * $dr + $dg * $dg + $db * $db);  

如果你愿意,你可以用八叉树做一些奇特的事情,但是只需要一小部分颜色就可以循环遍布它们,找到最小的距离就可以了。

答案 1 :(得分:1)

如果您使用hsla表示法,我认为这样做(并理解)会容易得多。

如果基色始终相同,则可以为色调参数定义20个值(基本上是从0°到360°的角度),并将所有不同的颜色分组为最接近的“基色”只有色调。

如果您的基色取决于输入(在您的问题中不明确),那么@Mark Reed找到颜色距离的选项也可以在hsl中完成,只能使用色调,这样会更准确'色调'恕我直言的概念。

  

NB:hsl的一个方便工具:http://mothereffinghsl.com/