Ответ 1
Чтобы просто вставить один png поверх другого, соблюдая прозрачность, попробуйте
background.paste(fire, (x,y), fire.convert("RGBA"))
Я очень новичок в 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, что черная граница (и нечетная точка фуксии). В документации указано, что оверлейное изображение должно быть одного размера. Но это похоже на общий сценарий, когда кто-то захочет разместить меньшую иконку с прозрачностью поверх другого изображения и составить их на одно изображение.
Я не привязан к какой-либо конкретной библиотеке, я широко открыт для идей и альтернатив. Единственное, что я пытаюсь сделать, это просто, так что создание всего игрового движка и т.п. Для создания изображения, вероятно, будет слишком большим.
Чтобы просто вставить один png поверх другого, соблюдая прозрачность, попробуйте
background.paste(fire, (x,y), fire.convert("RGBA"))
Сначала я бы сказал, что Йоханнес Холмберг уже ответил на вашу главную заботу: недостающая прозрачность.
Но я могу, надеюсь, объяснить, что это такое с этой нечетной точкой фуксии:
Прозрачное цветное изображение обычно хранится как RGBA (RGB для красного, зеленого, синего и A для Alpha
). Здесь Alpha
определяет прозрачность, от прозрачности до полной прозрачности.
Наложение изображений на правильный образ, мы видим логотип GIMP, но цветная полоса почти невидима - потому что она (почти) прозрачна.
Но - поскольку каждый пиксель может быть видимым - каждый пиксель все еще имеет цвет. Даже те пиксели с прозрачностью 100%
. Таким образом, если мы не принимаем во внимание Alpha
, мы видим каждый пиксельный цвет без прозрачности. Таким образом, у нас могут быть тревожные цвета, которые обычно не мешают - пока они полностью прозрачны.