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

时间:2009-04-14 09:41:45

标签: math colors alphablending

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

例如:

结果像素颜色为240,247,249,但我知道原始颜色的不透明度为10%,并且背景为白色(255,255,255)。计算原始RGB值的计算是什么?

3 个答案:

答案 0 :(得分:89)

标准混合方程式为:

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

outnewold是RGB颜色,alpha是[0,1]范围内的浮点数。

所以,你有(红色):

240 = 0.1 * newR + 0.9 * 255

解决newR,我们得到:

newR = (240 - 0.9 * 255) / 0.1

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

答案 1 :(得分:31)

我只是想知道你怎么知道它的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)

答案 2 :(得分:4)

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

    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));
    }

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

表示