2012-08-10 132 views
3

我有两个阵列,一个数组包含将被使用,而另一个阵列包含冗余的十六进制值,并且需要对所述参考阵列及其要匹配的十六进制颜色值值更新为参考索引。确定最接近的十六进制颜色针对现有十六进制的列表值

例如,这里是我将检查对参考样品(缩短的版本)。

$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

有许多方法来测量的两种颜色的“差异化”。哪一个比别人更“正确”是一种主观的问题。

维基百科Color difference下对此事的文章。准备让你的头脑旋转一下。

从科学的方法对此事
2

除了...

记住十六进制颜色代码是由三个2位十六进制数字(RGB值)组成的!所以你不能做到这一切在一次,因为前两位否则会增加你的十进制值太多)...

这是我会怎么做。

您可以分割您的颜色代码分成3个部分:

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

然后,可以比较每个颜色的参考文献(将它们分割成R/G/B以及)。

如果添加的差异,一个具有最低组合差值应该提供一个接近的颜色相似...

虽然,作为duskwuff已经提到,色觉是一个主观的问题。

2

有几个方法可以做到这一点。您需要一个函数来查找2个十六进制值之间的差值。无论你想要什么,你都可以实现它。将它转换为十进制数以找出差异可能更容易。如果您的数组未根据十六进制值进行排序,则可以执行的操作是获取数组的每个值并对其进行比较并将差异和索引存储在2个变量中。迭代数组,并将数值与数组中的每个值进行比较,并且每当发现变量中存储的变量小于变量中存储的变量时,应该使用新的较小差异更新临时索引和差异变量。这不是非常有效,因为它需要你通过整个阵列。更有效的是实现一个排序列表,然后将你的十六进制值与列表中的值进行比较,并在排序列表中找到合适的位置。

例如,在此列表:0 1 4 8 13 19,如果你想找到哪个数字最接近的价值数10那么所有你需要做的是找到其中10适合该列表,然后才比较的元素,之后,你会得到你的答案。

+0

是的,但问题是,十六进制颜色实际上是3个不同的数字放在一个字符串... – 2012-08-11 09:08:16

+0

我知道十六进制颜色如何工作。这只取决于他如何实现比较十六进制值的函数。这真的取决于他在这里寻找什么。他是否想要添加每种颜色(红色,绿色,蓝色)的差异的总和并且之后进行比较,或者基于某种颜色来区分优先次序完全取决于他。实施完全取决于他。 – minhaz1 2012-08-12 09:57:47