从一组十六进制颜色中获取基色
Posted
技术标签:
【中文标题】从一组十六进制颜色中获取基色【英文标题】:Get the base colours from a set of hex colours 【发布时间】:2012-12-06 08:20:16 【问题描述】:我有一组颜色,想将它们分解为 10 到 20 种 基本颜色。
这不应该是传入的内容的托盘,而是独立于传入的内容。因此,如果使用的图像只是各种红色阴影,它将仅返回红色,可能是浅红色/深红色。
EG:我的颜色是下面的框,输出示例为线条。所以在这个例子中,列表从 21 种颜色减少到 8 种。
上面的十六进制值:
#000000
#ffffff
#003e9f
#d61517
#00a7bd
#001070
#a0210c
#dc9103
#e6151e
#fdfdfd
#011171
#fbfd10
#ffc500
#fdc605
#e6141d
#faf703
#544b20
#796a3a
#7a6b3a
最终输出可能类似于此色轮的外圈
【问题讨论】:
我不知道你要什么,在这里。什么决定了“基础”颜色?如果你想减少图像中的颜色数量,有很多算法可以解决这个问题...... +1 表示手绘线。 (虽然需要更多的圈子)。 基本颜色类似于色轮示例,例如:它不应该输出 20 种不同色调的相同颜色。 是不是有点像在 Dribbble 上做的,当你选择一个帖子时,右边有调色板? 为什么不直接选择 20 种“均匀分布”的颜色并将图像码垛/抖动给它们? 【参考方案1】:提前选择您的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);
如果你愿意,你可以用八叉树做一些花哨的事情,但是用一小部分颜色循环它们并找到最小的距离就可以了。
【讨论】:
这大概是我的想法。将查看 3d 距离。【参考方案2】:我认为如果您使用 hsla 表示法,这样做(和理解)会容易得多。
如果您的基色始终相同,您可以为色调参数定义 20 个值(基本上是从 0° 到 360° 的角度),并将所有不同的颜色归为最接近的“基色”只有色调。
如果您的基色取决于输入(您的问题不清楚),那么@Mark Reed 查找颜色距离的选项也可以在 hsl 中完成,仅使用色调,这将更准确恕我直言,“颜色深浅”的概念。
NB : 一个方便的 hsl 工具 : http://mothereffinghsl.com/
【讨论】:
以上是关于从一组十六进制颜色中获取基色的主要内容,如果未能解决你的问题,请参考以下文章
#003366;#FFFFFF;#000000请问以上这些颜色代码,的含义?