我正在编写一个颜色选择器,可以从屏幕上的任何位置获取像素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,new和old是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.重复其他组件,你就完成了.
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).
以下伪代码可解决您的问题:
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] 表示