63

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

例如:

生成的像素颜色为 240,247,249,但我知道原始颜色的不透明度为 10%,并且位于白色 (255,255,255) 背景之上。计算出原始 RGB 值的计算方法是什么?

4

3 回答 3

102

标准混合方程为:

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

其中out和是 RGB 颜色,并且new是[0,1] 范围内的浮点数。oldalpha

所以,你有(红色):

240 = 0.1 * newR + 0.9 * 255

求解newR,我们得到:

newR = (240 - 0.9 * 255) / 0.1

计算结果为 105。对其他组件重复此操作,您就完成了。

于 2009-04-14T09:53:50.887 回答
36

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

于 2009-04-14T09:53:10.640 回答
5

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

    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] 表示

于 2016-03-18T16:48:35.300 回答