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


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

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

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

Вот что я пытался сделать до сих пор:

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; Обратите внимание, как там черная граница (и нечетная точка фуксии). В документации говорится, что наложенное изображение должно быть того же размера. Но это похоже на обычный сценарий, когда кто-то хочет поместить меньший значок с прозрачностью поверх другого изображения и скомпоновать их в одно изображение.

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

2 ответа:

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

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

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

Но я надеюсь, что смогу объяснить, что это за странная точка цвета фуксии.:

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

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

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

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

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