Создавайте сложенное изображение с различными размерами слоев с прозрачностью

Я очень новичок в Python и изучаю его, чтобы пользователи могли создавать пользовательские изображения. Идея заключается в том, что клиент будет выбирать несколько параметров, и изображение будет создано на сервере, а затем загружено (или используется для других вещей на стороне сервера).

Изображение состоит из множества изображений, большинство из которых представляют собой небольшие изображения типов изображений, которые имеют неправильную форму и имеют прозрачность. Все слои являются .png файлами.

Я пытался использовать Pillow, но кажется, что изображение должно быть того же размера, что и общее изображение, чтобы правильно использовать прозрачность верхних слоев.

Вот что я пробовал до сих пор:

from PIL import Image

background = Image.open("Background.png")
foreground = Image.open("Trim.png")
fire = Image.open("Type_Fire_Large.png")

background = Image.alpha_composite(background, foreground)
background.paste(fire, (150, 150))
background.show()

Изображение выглядит так:

Многослойное изображение с черным на наложении

Background.png - затененный "шум", а Trim.png - серая диагональная линия. Наилучшая часть: Trim.png имеет центр прозрачности и может показывать Background.png посередине. Но он также того же размера, что и изображение.

Проблема Fire; обратите внимание, как theres, что черная граница (и нечетная точка фуксии). В документации указано, что оверлейное изображение должно быть одного размера. Но это похоже на общий сценарий, когда кто-то захочет разместить меньшую иконку с прозрачностью поверх другого изображения и составить их на одно изображение.

Я не привязан к какой-либо конкретной библиотеке, я широко открыт для идей и альтернатив. Единственное, что я пытаюсь сделать, это просто, так что создание всего игрового движка и т.п. Для создания изображения, вероятно, будет слишком большим.

Ответ 1

Чтобы просто вставить один png поверх другого, соблюдая прозрачность, попробуйте

background.paste(fire, (x,y), fire.convert("RGBA"))

Ответ 2

Сначала я бы сказал, что Йоханнес Холмберг уже ответил на вашу главную заботу: недостающая прозрачность.

Но я могу, надеюсь, объяснить, что это такое с этой нечетной точкой фуксии:

Прозрачное цветное изображение обычно хранится как RGBA (RGB для красного, зеленого, синего и A для Alpha). Здесь Alpha определяет прозрачность, от прозрачности до полной прозрачности.

Наложение изображений на правильный образ, мы видим логотип GIMP, но цветная полоса почти невидима - потому что она (почти) прозрачна.

Использование RGBA

Но - поскольку каждый пиксель может быть видимым - каждый пиксель все еще имеет цвет. Даже те пиксели с прозрачностью 100%. Таким образом, если мы не принимаем во внимание Alpha, мы видим каждый пиксельный цвет без прозрачности. Таким образом, у нас могут быть тревожные цвета, которые обычно не мешают - пока они полностью прозрачны.

введите описание изображения здесь