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

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/

【讨论】:

以上是关于从一组十六进制颜色中获取基色的主要内容,如果未能解决你的问题,请参考以下文章

ff000000是啥颜色

#003366;#FFFFFF;#000000请问以上这些颜色代码,的含义?

如何从脚本的纯色图像中获取十六进制颜色代码?

Swift iOS Sprite Kit - 将精灵从一种颜色淡化为另一种颜色[关闭]

Javascript - 生成相同颜色的不同阴影

从一篇nature medicine文章的得到的可用于文献画图的19种16进制颜色码