【问题标题】:How to calculate an RGB colour by specifying an alpha blending amount?如何通过指定 alpha 混合量来计算 RGB 颜色?
【发布时间】:2010-10-19 07:33:13
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: math colors alphablending


    【解决方案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));
        }
    

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

    【讨论】:

      【解决方案2】:

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

      如果混合模式是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)

      【讨论】:

      • 对不起,我应该提到混合模式是正常的。我从一个带有不透明度设置的图像的网页中挑选颜色,所以我知道它不仅仅是 rgb。还是谢谢。
      【解决方案3】:

      标准混合方程为:

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

      其中outnewold 是 RGB 颜色,alpha 是 [0,1] 范围内的浮点数。

      所以,你有(红色):

      240 = 0.1 * newR + 0.9 * 255
      

      求解newR,我们得到:

      newR = (240 - 0.9 * 255) / 0.1
      

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

      【讨论】:

      • ?你的方程和我的不一样吗?
      • 是的,我的方程是一样的,但写法略有不同。
      • 哇!我已经拉了 2 个小时的头发,试图通过比较 Photoshop 中的值来逆向工程这个方程!谢谢你减缓了我的脱发!您是如何找到或得出这个等式的?
      • 您好,我知道这是一篇旧帖子,但我似乎没有在 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。知道为什么会发生这种情况吗?
      • 如果结果是否定的怎么办?
      猜你喜欢
      • 2013-06-05
      • 1970-01-01
      • 2019-03-30
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-12
      • 2018-03-07
      相关资源
      最近更新 更多