Просто посмотрите на указанные вами числа:
(1.0-0.8)*255 ~= 50.9 = 51
Где:
- 1.0 - максимальная альфа-интенсивность
- 0.8 - текущая альфа-интенсивность
- 255 - максимальная интенсивность каждого из каналов RGB (цвет фона)
Это соответствует каналам B и G. вашего примера.
Таким образом, в общем случае это, кажется, простое взвешенное среднее между значением канала (RGB) и цветом фона (в вашем случае, белый - 255).В качестве веса используется альфа.
Вот некоторый код Python:
MIN_ALPHA=0.0
MAX_ALPHA=1.0
MIN_CH=0
MAX_CH=255
BG_VAL=255
def apply_alpha(old, alpha, bg=255):
assert alpha >= MIN_ALPHA
assert alpha <= MAX_ALPHA
assert old >= MIN_CH
assert old <= MAX_CH
new = old*alpha + (MAX_ALPHA - alpha)*bg
return new
if __name__ == '__main__':
import sys
old, alpha = map(float, sys.argv[1:])
print apply_alpha(old, alpha)
И некоторый вывод:
misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 255 0.8
255.0
misha@misha-K42Jr:~/Desktop/stackoverflow$ python alpha.py 0 0.8
51.0
Попробуйте это для других примеров (в частности,не белый фон) - это наверное так просто.Если нет, то отредактируйте свой ответ новыми примерами, и я посмотрю по-другому.