Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Colors 如何从两个RGB值中找到颜色的RGBA值?_Colors_Rgb_Similarity_Color Space_Argb - Fatal编程技术网

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

Colors 如何从两个RGB值中找到颜色的RGBA值?,colors,rgb,similarity,color-space,argb,Colors,Rgb,Similarity,Color Space,Argb,我有一种预感,这是以前做过的,但我在这方面完全是个门外汉,不知道如何开始问正确的问题。因此,我将描述我正在尝试做什么 我有一个未知的ARGB颜色。我只知道它的绝对RGB值显示在两种已知的不透明背景色上,例如黑色0x000000和白色0xFFFF。因此,为了继续这个示例,如果我知道ARGB颜色在0x000000以上显示时为RGB 0x000080等效,并且我知道相同的ARGB颜色在0xFFFFFF以上显示时为RGB 0x7F7FFF等效,是否有方法计算原始ARGB颜色是什么 或者这可能吗?那么,你

我有一种预感,这是以前做过的,但我在这方面完全是个门外汉,不知道如何开始问正确的问题。因此,我将描述我正在尝试做什么

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

或者这可能吗?

那么,你知道把(a,r,g,b)放在(r1,g1,b1)上面会给你(r1,g1,b1),把它放在(r2,g2,b2)上面会给你(r2,g2,b2)。换句话说——顺便说一下,我将在这里以a从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)符号(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)=(255255);(R1,G1,B1)=(0,0128);(R2,G2,B2)=(127255)。所以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。

选择黑色和白色作为背景色是最好的选择,这既便于计算,也有助于结果的准确性。大量滥用符号

  • 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或两个背景颜色相同。在你和加雷斯之间,我想我已经掌握了这个问题所涉及的代数。你们甚至想出了我例子中的原色!太神了那很有趣。。。所以你可以从红色通道算出阿尔法。。。我注意到,当我制作我的示例时,即使原始颜色的红色值为0,但在白色上透明时,它变为7F。当然,这是有道理的,但我不得不考虑一下。顺便说一下,你的意思是:a=1-[127+127+127]/[255+255+255]=127/255,对吗?我不这么认为。这是1-127/255=128/255。但是我的算术非常不可靠,所以可能我都错了:-)。我看到了错误,我误解了下一行的127/255是“a”而不是“1-a”,这确实会像你最初写的那样是“a”128/255。我想我还是拿到了!