如何从两个RGB值中找到颜色的RGBA值?

时间:2011-03-29 09:33:46

标签: colors rgb similarity color-space argb

我有预感这是以前做过但我在这方面是一个完全的门外汉并且不知道如何开始提出正确的问题。所以我将描述我想要做的事情......

我有一种未知的ARGB颜色。我只知道它在两种已知的不透明背景颜色上显示的绝对RGB值,例如黑色0x000000和白色0xFFFFFF。所以,继续这个例子,如果我知道当显示超过0x000000时ARGB颜色是RGB 0x000080等效并且我知道当显示在0xFFFFFF以上时相同的ARGB颜色是RGB 0x7F7FFF等效,是否有办法计算原始ARGB颜色是

或者这甚至可能???

2 个答案:

答案 0 :(得分:2)

所以,你知道把(a,r,g,b)放在(r1,g1,b1)给你(R1,G1,B1)并把它放在(r2,g2,b2)给你( R2,G2,B2)。换句话说 - 顺便说一句,我打算在0到1范围内的单位工作 - 你知道(1-a)r1 + ar = R1,(1-a)r2 + ar = R2等。取这两个并减去:得到(1-a)(r1-r2)= R1-R2,因此a = 1-(R1-R2)/(r1-r2)。一旦你知道了,你就可以解决所有问题。

你应该实际计算你在{R,G,B}的所有三个上进行计算得到的值,并对它们进行平均,以减少舍入误差的影响。事实上我建议你取一个= 1 - [(R1-R2)符号(r1-r2)+(G1-G2)符号(g1-g2)+(B1-B2)符号(b1-b2)] /(| r1-r2 | + | g1-g2 | + | b1-b2),相当于对更可靠的颜色进行加权。

现在你有例如r =(R1-(1-a)r1)/ a =(R2-(1-a)r2)/ a。如果a,r,g,b具有无限精度值,则这两个值相等,但实际上它们可能略有不同。平均值:r = [(R1 + R2) - (1-a)(r1 + r2)] / 2a。

如果您的a值恰好非常小,那么您将获得有关r,g,b的相当不可靠的信息。 (在a = 0的限制下你根本就得不到任何信息,显然你无能为力。)你可能会得到超出0..255范围的数字,在这种情况下我不会认为你可以做得比剪裁更好。

以下是针对您的特定示例的工作原理。 (R1,G1,B1)=(0,0,0); (R2,G2,B2)=(255,255,255); (R1,G1,B1)=(0,0,128); (R2,G2,B2)=(127127255)。所以a = 1 - [127 + 127 + 127] / [255 + 255 + 255] = 128/255,这恰好是a的256个实际可能值之一。 (如果不是,我们应该在这个阶段将其舍入。)

现在r =(127-255 * 127/255)* 255/256 = 0;同样g = 0;和b =(383-255 * 127/255)* 255/256 = 255。

所以我们的ARGB颜色是80,00,00,FF。

答案 1 :(得分:1)

选择黑色和白色作为背景颜色是最佳选择,既便于计算又能提高结果的准确性。有很多滥用符号......

  • a(RGB)+(1-a)0xFFFFFF = 0x7F7FFF
  • a(RGB)+(1-a)0x000000 = 0x000080

从第一个中减去第二个......

  • (1-a)0xFFFFFF = 0x7F7FFF-0x000080 = 0x7F7F7F

所以

  • (1-a)= 0x7F / 0xFF
  • a =(0xFF-0x7F)/ 0xFF = 0x80 /​​ 0xFF
  • A = 0x80

和RGB =(a(RGB))/ a = 0x000080 / a = 0x0000FF

您可以使用其他背景颜色选项做一些非常相似的事情。 a越小,两种背景颜色越接近,您就越不能准确确定RGBA值。考虑A = 0或两种背景颜色相同的极端情况。