Вышеупомянутый ответ работает, если изображение не предварительно умножено на альфа. Однако, если вы используете этот тип смешивания с предварительно умноженным альфа-изображением, будет черная рамка.
Предварительно умноженная альфа:
Когда изображение создается, значения цвета умножаются на альфа-канал. Взгляните на этот пример с одним пикселем:
Pixel: r = 1, g = 0, b = 0, a = 0.5
Когда он будет сохранен, значения rgb будут умножаться на альфа-значение, давая:
Pixel: r = 0.5, g = 0, b = 0, a = 0.5
Чтобы смешать этот вид image вам нужно использовать следующую формулу:
result.r = background.r * (1 - A) + foreground.r
result.g = background.g * (1 - A) + foreground.g
result.b = background.b * (1 - A) + foreground.b
Непремультиплексная альфа
В этом примере альфа-канал полностью отделен от цветных каналов.
Pixel: r = 1, g = 0, b = 0, a = 0.5
Когда он сохранен:
Pixel: r = 1, g = 0, b = 0, a = 0.5
То же самое. В этом случае ответ, предоставленный minitech, является правильным.
Более подробную информацию можно найти здесь: Предварительно умноженная альфа