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

55 math alphablending colors

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

例如:

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

unw*_*ind 91

标准混合方程是:

out = alpha * new + (1 - alpha) * old
Run Code Online (Sandbox Code Playgroud)

其中out,newold是RGB的颜色,并且alpha取值范围为[0,1]浮点数.

所以,你有(红色):

240 = 0.1 * newR + 0.9 * 255
Run Code Online (Sandbox Code Playgroud)

解决newR,我们得到:

newR = (240 - 0.9 * 255) / 0.1
Run Code Online (Sandbox Code Playgroud)

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

  • 在 sRGB 时代,这个答案不太准确。问题是伽玛校正。红色、绿色和蓝色通道值不是真实的光强度。它们以非线性方式进行变换。在sRGB中使用变换函数。出于混合目的,您可以使用幂 2.2 通过幂律对其进行近似。因此更准确的公式是“out = (alpha * new^2.2 + (1 - alpha) * old^2.2)^(1 / 2.2)”。但是,如果您编写类似图像处理器之类的东西,您可能需要深入研究 sRGB 转换才能正确完成。 (3认同)
  • ?你的方程和我的不一样吗? (2认同)
  • 是的,方程是相同的,但写法略有不同。 (2认同)
  • 哇!我已经把头发拉了2个小时试图通过比较photoshop中的值来逆向设计这个等式!谢谢你减缓我的脱发!您是如何找到或提出这个等式的? (2认同)
  • 你好,我知道这是一篇旧帖子,但我似乎没有在 Photoshop 上应用它。我将像素 (255,0,0) 放在白色 (255,255,255) 之上,并将不透明度更改为 0.1。结果(255,229,229)。根据方程 newPixelRed =(255-0.9*255)/0.1,排除后结果为 255。然而,对于绿色,newPixelGreen = (0-0.9*255)/0.1 结果为-2295,应该是229。知道为什么会发生这种情况吗? (2认同)

Pet*_*háč 33

我只是想知道你怎么知道它的alpha而不是它的r,g,b ......除非使用的混合模式在每种情况下都是正常的,否则你将无法计算原始值.即使一切都是理想的,你也只能近似,因为从原始到结果可能已经发生了一些舍入.此外,从结果返回到原始状态时,您很可能必须进行舍入.

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

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.
Run Code Online (Sandbox Code Playgroud)

不透明度(alpha/100).


Dan*_*lba 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));
    }
Run Code Online (Sandbox Code Playgroud)

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