如何通过指定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]