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


Determine the closest hex color against a list of existing hex values

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

例如,这是我将检查的参考的示例(缩短版本)。

$ref_array = array(4 => '000000', 66 => 'C31AOC', 162 => 'AD2823');

这是需要尽可能接近引用匹配的数组。

$orig_array = array('1' => '2be944', 2 => '2f3136', 3 => '88110d');

他们不是orig_array不是为了对抗ref_array。

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

$new_array('2be944' => 4) 

它保存的指数值为 orig_array

我将如何执行此操作或类似操作?

除了对此事的科学方法...

请记住,十六进制

颜色代码由三个 2 位十六进制数字(RGB 值)组成!所以你不能一次完成所有操作,因为前两位数字会过多地增加你的十进制值)......

这是我会怎么做的。

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

  • R = 2B --> 43 十进制
  • G = E9 --> 233 十进制
  • B = 44 --> 68 十进制

然后,您可以将每种颜色与参考进行比较(将它们也拆分为 R/G/B)。

如果添加差异,组合差异最小的那个应该提供接近的颜色相似性......

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

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

例如,在此列表中:0 1 4 8 13 19如果您想找到哪个数字的值最接近10,那么您需要做的就是找到 10 在该列表中的位置,然后将其与前后的元素进行比较,您将获得答案。

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

维基百科在色差下有一篇关于此事的文章。准备好让你的头旋转一下。