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

Math 如何通过指定alpha混合量来计算RGB颜色?,math,colors,alphablending,Math,Colors,Alphablending,我正在编写一个颜色选择器,它可以从屏幕上的任何位置获取像素RGB值。我还想选择指定我拾取的颜色已经具有alpha值。我只是想知道如何计算得到的颜色 例如: 生成的像素颜色是240247249,但我知道原始颜色的不透明度为10%,并且位于白色(255255)背景之上。计算原始RGB值的计算方法是什么?我只是想知道为什么你知道它的alpha而不是r,g,b。。。除非在所有情况下使用的混合模式都是正常的,否则您将无法计算原始值。即使一切都是理想的,你们也只能进行近似计算,因为从原始数据到结果可能已经进

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

例如:


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

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

如果混合模式正常,则不会太困难:-)


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

标准混合方程为:

out = alpha * new + (1 - alpha) * old
其中,
out
new
old
是RGB颜色,
alpha
是范围[0,1]内的浮点数

因此,您有(对于红色):

解决
newR
,我们得到:

newR = (240 - 0.9 * 255) / 0.1

总数为105。对其他组件重复上述步骤,即可完成操作。

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

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

对不起,我应该提到混合模式是正常的。我从一个有不透明度设置的网页上挑选颜色,所以我知道这不仅仅是rgb。无论如何,谢谢你。?你的方程和我的方程不一样吗?是的,我知道方程是一样的,只是写的有点不同。哇!我花了两个小时的时间试图通过比较photoshop中的值来逆向工程这个等式!谢谢你减缓了我的脱发!你是怎么发现或想出这个方程式的?你好,我知道这是一篇老文章,但我似乎没有把它应用到photoshop上。我把一个像素(255,0,0)放在一个白色(255255)的上面,并将不透明度改为0.1。结果(255229229)。方程newPixelRed=(255-0.9*255)/0.1中,除此之外为255。但是,对于绿色,newPixelGreen=(0-0.9*255)/0.1将得到-2295,应该是229。知道为什么会这样吗?如果结果是否定的呢?
newR = (240 - 0.9 * 255) / 0.1
    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));
    }