我有两个数组,一个数组包含将使用的十六进制颜色值,而另一个数组包含冗余十六进制值,需要与引用数组匹配,并将其值更新为引用索引。
例如,以下是我将要检查的参考样本(缩短版本)。
$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的索引值
我该怎么办?或者类似的东西?
答案 0 :(得分:2)
除了对此事的科学方法......
请记住,十六进制颜色代码由三个2位十六进制数字(RGB值)组成!所以你不能一次完成所有这一切,因为前两位数会增加你的十进制值太多)...
我将如何做到这一点。
您可以将颜色代码分为3个部分:
然后,您可以将每种颜色与参考颜色进行比较(将它们分成R / G / B)。
如果添加差异,组合差异最小的差异应提供近似的颜色相似...
虽然,正如暮光之城已经提到的,色彩感知是一个主观问题。
答案 1 :(得分:2)
有几种方法可以做到这一点。您需要一个函数来查找2个十六进制值之间的值的差异。你可以随心所欲地实现它。将它转换为十进制可能更容易找到差异。如果您的数组未根据十六进制值进行排序,那么您可以执行的操作是获取数组的每个值并进行比较,并将差异和索引存储在2个变量中。迭代数组并将值与数组中的每个值进行比较,每当您发现差异小于变量中存储的差值时,您应该使用新的较小差异更新临时索引和差异变量。这不是很有效,因为它需要您遍历整个阵列。更有效的是实现排序列表,然后将十六进制值与列表中的值进行比较,并在排序列表中找到适当的位置。
例如,在此列表中:0 1 4 8 13 19
如果要查找哪个数字的值最接近数字10
,那么您需要做的就是找到10个符合该列表的数字然后将它与之前和之后的元素进行比较,你就会得到答案。
答案 2 :(得分:0)
有多种方法可以测量两种颜色的“差异”。哪些比其他更“正确”是一种主观问题。
维基百科在Color difference下有一篇关于此事的文章。准备好让你的头旋转一下。