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