我有两个数组,一个数组包含将使用的十六进制颜色值,而另一个数组包含冗余的十六进制值,需要与引用数组匹配,其值更新为引用的索引。
例如,这是我将检查的参考的示例(缩短版本)。
$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 在该列表中的位置,然后将其与前后的元素进行比较,您将获得答案。
有许多方法可以测量两种颜色的"差异"。哪些比其他的更"正确"是一种主观问题。
维基百科在色差下有一篇关于此事的文章。准备好让你的头旋转一下。