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