【问题标题】: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 种“均匀分布”的颜色并将图像码垛/抖动给它们?

标签: php colors


【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-05
    • 2012-11-04
    • 2013-06-07
    • 2011-07-12
    • 2015-04-12
    • 2011-10-25
    • 2019-06-16
    • 2021-03-08
    相关资源
    最近更新 更多