Php 根据现有十六进制值列表确定最接近的十六进制颜色

Php 根据现有十六进制值列表确定最接近的十六进制颜色,php,colors,Php,Colors,我有两个数组,一个数组包含将要使用的十六进制颜色值,而另一个数组包含冗余十六进制值,需要与引用数组匹配,并将其值更新为引用的索引 $orig_array = array('1' => '2be944', 2 => '2f3136', 3 => '88110d'); 例如,下面是我将要检查的参考的一个示例(缩写版本) $ref_array = array(4 => '000000', 66 => 'C31AOC', 162 => 'AD2823'); 这是需

我有两个数组,一个数组包含将要使用的十六进制颜色值,而另一个数组包含冗余十六进制值,需要与引用数组匹配,并将其值更新为引用的索引

$orig_array = array('1' => '2be944', 2 => '2f3136', 3 => '88110d');
例如,下面是我将要检查的参考的一个示例(缩写版本)

$ref_array = array(4 => '000000', 66 => 'C31AOC', 162 => 'AD2823');
这是需要尽可能接近引用的数组

$orig_array = array('1' => '2be944', 2 => '2f3136', 3 => '88110d');
它们不是原始数组,与参考数组不一致

我不确定这在PHP中是否可行,但假设orig_数组中的第一个元素是绿色,而在引用数组中,最接近的颜色是2be944,因此将创建一个新数组,如下所示:

$new_array('2be944' => 4) 
它保存orig_数组的索引值


我该怎么做呢?

有很多方法可以测量两种颜色的“差异”。哪一个比其他的更“正确”是一种主观问题


维基百科上有一篇关于这个问题的文章。准备好让你的脑袋转一转。

除了科学方法之外

请记住,十六进制颜色代码由三个2位十六进制数字(RGB值)组成!因此,您不能一次完成所有操作,因为前两位数字将使十进制值增加过多)

我会这样做的

您可以将颜色代码分为3个部分:

  • R=2B-->43十进制
  • G=E9-->233十进制
  • B=44-->68十进制
然后,您可以将每种颜色与参考进行比较(也可以将它们拆分为R/G/B)

如果你加上这些差异,组合差异最小的那一个应该提供一个相近的颜色相似性


虽然,正如Daskwuff已经提到的,颜色感知是一个主观问题。

有几种方法可以做到这一点。您需要一个函数来查找两个十六进制值之间的值差。你可以随心所欲地实现它。将其转换为十进制可能更容易找到差异。如果您的数组尚未根据十六进制值排序,那么您可以获取数组的每个值并进行比较,然后将差异和索引存储在2个变量中。遍历数组并将值与数组中的每个值进行比较,每当发现差异小于存储在变量中的值时,应使用新的较小差异更新临时索引和差异变量。这不是很有效,因为它需要遍历整个阵列。更有效的方法是实现一个排序列表,然后将十六进制值与列表中的值进行比较,并在排序列表中找到它的正确位置


例如,在这个列表中:
0 1 4 8 13 19
如果你想找到哪个数字的值最接近这个数字
10
,那么你需要做的就是找到10适合这个列表的位置,然后将它与之前和之后的元素进行比较,你就会得到答案

是的,但问题是十六进制颜色实际上是三个不同的数字放在一个字符串中…我知道十六进制颜色是如何工作的。这将取决于他如何实现比较十六进制值的函数。这真的取决于他在这里找什么。他是想把每种颜色(红、绿、蓝)的差异相加,然后进行比较,还是根据某一种颜色进行优先排序,这完全取决于他自己。执行完全取决于他。