【问题标题】:How to blend two RGB colors (front and back) based on their alpha channels如何根据 Alpha 通道混合两种 RGB 颜色(正面和背面)
【发布时间】:2019-03-30 06:43:18
【问题描述】:

我正在尝试组合以元组形式给出的两种 RGBA 颜色,例如 (0, 0, 0, 128) 和 (255, 255, 255, 128)。我已经找到了 this 这很有帮助,但是我当前的代码(Python)

def get_color(colorRGBA1, colorRGBA2):
    alpha = 255 - (255 - colorRGBA1[3]) * (255 - colorRGBA2[3])
    red   = (colorRGBA1[0] * (255 - colorRGBA2[3]) + colorRGBA2[0] * colorRGBA2[3]) / 255
    green = (colorRGBA1[1] * (255 - colorRGBA2[3]) + colorRGBA2[1] * colorRGBA2[3]) / 255
    blue  = (colorRGBA1[2] * (255 - colorRGBA2[3]) + colorRGBA2[2] * colorRGBA2[3]) / 255
    return (int(red), int(green), int(blue), int(alpha))

以某种方式返回一些奇怪的数字(如 -15874)作为 alpha。其他一切正常,但我不知道如何获得新颜色的 alpha 值。

两种颜色的 alpha 值都在 0 到 255 之间。

【问题讨论】:

    标签: python alpha rgba


    【解决方案1】:

    正确的代码是:

    def get_color(colorRGBA1, colorRGBA2):
        alpha = 255 - ((255 - colorRGBA1[3]) * (255 - colorRGBA2[3]) / 255)
        red   = (colorRGBA1[0] * (255 - colorRGBA2[3]) + colorRGBA2[0] * colorRGBA2[3]) / 255
        green = (colorRGBA1[1] * (255 - colorRGBA2[3]) + colorRGBA2[1] * colorRGBA2[3]) / 255
        blue  = (colorRGBA1[2] * (255 - colorRGBA2[3]) + colorRGBA2[2] * colorRGBA2[3]) / 255
        return (int(red), int(green), int(blue), int(alpha))
    

    ...因为我必须将 (255 - colorRGBA1[3]) * (255 - colorRGBA2[3]) 除以 255 才能得到有效的 alpha 值。

    【讨论】:

      【解决方案2】:

      https://gist.github.com/JordanDelcros/518396da1c13f75ee057 处查看 JavaScript 解决方案

      请注意,此实现的 alpha 在 [0,1] 范围内,因此在混合之前将您的 alpha 值除以 255,最后将最终的 alpha 乘以 255。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-14
        • 2013-06-05
        • 2011-04-09
        相关资源
        最近更新 更多