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

4
我有一种预感,这可能已经被做过,但我是一个完全的门外汉,不知道如何开始问正确的问题。因此,我将描述我的尝试...
我有一个未知的ARGB颜色。我只知道它在两个已知的不透明背景颜色上显示的绝对RGB值,例如黑色0x000000和白色0xFFFFFF。因此,以继续上面的示例,如果我知道ARGB颜色在0x000000上显示时等同于RGB 0x000080,并且我知道同一ARGB颜色在0xFFFFFF上显示时等同于RGB 0x7F7FFF,那是否有一种方法计算出原始的ARGB颜色呢?
或者这真的可能吗?
2个回答

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)。 一旦你知道 a,你就可以算出其他所有东西。
事实上,你应该计算出从对 {R、G、B} 做这个计算而得到的所有 a 的值,并对其进行平均或其他处理,以减少舍入误差的影响。 实际上,我建议您采用 a = 1-[(R1-R2)sign(r1-r2)+(G1-G2)sign(g1-g2)+(B1-B2)sign(b1-b2)]/(|r1-r2|+|g1-g2|+|b1-b2)),这相当于更高地对可靠的颜色加权。
现在你有了,例如 r = (R1-(1-a)r1)/a=(R2-(1-a)r2)/a。 如果你有无限精度的值,这两个值将相等,但在实践中它们可能略有不同。 取平均值: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)=(127,127,255)。 因此,a=1-[127+127+127]/[255+255+255]=128/255,这恰好是256个实际可能的 a 值之一。(如果不是这样,我们应该在这个阶段四舍五入。)
现在r=(127-255*127/255)*255/256=0;同理,g=0;并且 b=(383-255*127/255)*255/256=255。
因此,我们的 ARGB 颜色是80,00,00,FF。

很有趣...所以你实际上可以从红色通道计算出alpha值...我注意到当我制作示例时,即使原始颜色的红色值为0,在白色背景下透明后它变成了7F。当然这是有道理的,但我需要思考一会儿才能明白。 - jpwrunyan
顺便提一下,你的意思是写成:a = 1 - [127+127+127]/[255+255+255] = 127/255 对吧? - jpwrunyan
我不这么认为。那是1-127/255 = 128/255。但我的算术非常不可靠,所以我可能全错了 :-)。 - Gareth McCaughan
我看到错误了,我误解了下一行的127/255,它应该是"1-a"而不是"a",这确实会让"a"成为你最初写的128/255。不过我想我已经搞懂了! - jpwrunyan

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或两个背景颜色相同。


谢谢!在您和Gareth的帮助下,我对这个问题所涉及的代数有了一些了解。而且你们甚至还找出了我示例中使用的原始颜色!太神奇了! - jpwrunyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接