Есть набор спрайтов с альфа-каналом, которые надо скомпоновать в картинку. PIL.Image.paste по умолчанию игнорирует альфа-канал. PIL.Image.alpha_composite не позвляет вставить спрайт в отрицательные координаты, то есть автоматически обрезать спрайт верхним или левым краем картинки.
Создать картинку побольше и обрезать — можно, но не нравится. Есть ли другие варианты alpha_composite? Или как использовать параметр mask в paste, чтобы он в точности соответствовал альфа-каналу вставляемого спрайта?
Делал примерно так:
from PIL import Image
img = Image.new('RGBA', (100, 100))
sprite1 = Image.open('sprite1.png')
sprite2 = Image.open('sprite2.png')
img.paste( sprite1, (0, 10) )
img.paste( sprite2, (0, 15) ) # альфа-канал затирает рисунок
img.alpha_composite( sprite2, (0, 20) ) # альфа-канал сохраняет рисунок
img.alpha_composite( sprite2, (0, -10) ) # ошибка
P.S. Если создать mask = Image.new('RGBA', img.size), вставить в него спрайт mask.paste( sprite, xy ) и вставлять с этой маской img.paste( sprite, xy, mask=mask ), спрайт вставляется ПОД существующее изображение.
Ответ:
img.paste( sprite, xy, mask=sprite )