如何根据 alpha 通道混合两种 RGB 颜色(正面和背面)
How to blend two RGB colors (front and back) based on their alpha channels
我正在尝试组合以元组形式给出的两种 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))
不知何故 returns 一些奇怪的数字(如 -15874)作为 alpha。其他一切正常,但我不知道如何获取新颜色的 alpha 值。
两种颜色的 alpha 值都在 0 到 255 之间。
正确的代码是:
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 值。
请参阅 JavaScript 中的解决方案 https://gist.github.com/JordanDelcros/518396da1c13f75ee057
请注意,此实现在 [0,1] 范围内具有 alpha,因此在混合之前将您的 alpha 值除以 255,最后将最终的 alpha 乘以 255。
我正在尝试组合以元组形式给出的两种 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))
不知何故 returns 一些奇怪的数字(如 -15874)作为 alpha。其他一切正常,但我不知道如何获取新颜色的 alpha 值。
两种颜色的 alpha 值都在 0 到 255 之间。
正确的代码是:
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 值。
请参阅 JavaScript 中的解决方案 https://gist.github.com/JordanDelcros/518396da1c13f75ee057
请注意,此实现在 [0,1] 范围内具有 alpha,因此在混合之前将您的 alpha 值除以 255,最后将最终的 alpha 乘以 255。