Как смешать два цвета RGB (спереди и сзади) на основе их альфа-каналов - PullRequest
0 голосов
/ 25 октября 2018

Я пытаюсь объединить два цвета 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) в виде альфы.Все остальное работает нормально, но я не могу понять, как получить альфа-значение нового цвета.

Оба цвета будут иметь альфа-значения в диапазоне от 0 до 255.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

См. Решение в JavaScript на https://gist.github.com/JordanDelcros/518396da1c13f75ee057

Обратите внимание, что эта реализация имеет альфа в диапазоне [0,1], поэтому разделите ваши альфа-значения на 255 перед смешиванием и наend умножьте итоговую альфу на 255.

0 голосов
/ 25 октября 2018

Правильный код:

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, чтобы получить действительное альфа-значение.

...