12

我有一套颜色,想把它们分解成 10 到 20种基色

这不应该是传入的内容的托盘,而是独立于传入的内容。因此,如果使用的图像只是各种红色阴影,它将仅返回红色,可能带有浅/深红色。

EG:我的颜色是下面的框,输出示例为线条。所以在这个例子中,列表从 21 种颜色减少到 8 种。

在此处输入图像描述

上面的十六进制值:

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

最终输出可能类似于此色轮的外环在此处输入图像描述

4

2 回答 2

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);  

如果你愿意的话,你可以用八叉树做一些花哨的事情,但是用一小部分颜色循环它们并找到最小的距离就可以了。

于 2012-12-19T02:47:59.150 回答
1

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

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

如果您的基色取决于输入(在您的问题中不清楚),那么@Mark Reed 查找颜色距离的选项也可以在 hsl 中完成,仅使用色调,这将更准确的概念'颜色深浅'恕我直言。

注意:hsl 的便捷工具:http: //mothereffehsl.com/

于 2012-12-19T10:18:55.857 回答