如何通过指定alpha混合量来计算RGB颜色?

我正在写一个颜色select器,可以从屏幕上的任何位置获取像素RGB值。 我想也可以select指定我select的颜色已经有一个alpha值。 我只是想知道如何计算结果颜色。

例如:

由此产生的像素颜色是240,247,249,但我知道原来的颜色有10%的不透明度,并在白色(255,255,255)的背景上。 计算原始RGB值的计算是什么?

标准的混合方程是:

out = alpha * new + (1 - alpha) * old 

在哪里, old是RGB颜色, alpha是在[0,1]范围内的浮点数。

所以,你有(红色):

 240 = 0.1 * newR + 0.9 * 255 

解决newR ,我们得到:

 newR = (240 - 0.9 * 255) / 0.1 

其中评估为105.重复其他组件,你就完成了。

我只是想知道你怎么知道它的alpha,而不是它的r,g,b …除非所用的混合模式在每种情况下都是Normal,否则将无法计算原始值。 即使一切都是理想的,你只能够近似,因为从原来的结果已经可能已经发生了一些四舍五入。 而且,当从结果返回到原始时,您很可能不得不四舍五入。

如果混合模式是正常的,那么它不是太难:-)

 opacity*original + (1-opacity)*background = resulting pixel original R = (resulting R - ((1-opacity)*background R)) / opacity. original G = (resulting G - ((1-opacity)*background G)) / opacity. original B = (resulting B - ((1-opacity)*background B)) / opacity. 

其中不透明度是(alpha/100)

以下伪代码可以解决您的问题:

  CalculateSolidColorFromTransparentColor(Color color, Color background) { alpha = color.A / 255; oneminusalpha = 1 - alpha; newR = ((color.R * alpha) + (oneminusalpha * background.R)); newG = ((color.G * alpha) + (oneminusalpha * background.G)); newB = ((color.B * alpha) + (oneminusalpha * background.B)); } 

请注意,input颜色和背景的值以[0..255]