У меня есть прозрачное изображение png "foo.png", и я открыл другое изображение с
im = Image.open("foo2.png");
Теперь мне нужно объединить foo.png с foo2.png.
(foo.png содержит некоторый текст, и я хочу напечатать этот текст на foo2.png)
У меня есть прозрачное изображение png "foo.png", и я открыл другое изображение с
im = Image.open("foo2.png");
Теперь мне нужно объединить foo.png с foo2.png.
(foo.png содержит некоторый текст, и я хочу напечатать этот текст на foo2.png)
;
в конце своих команд в python: это уродливо ...Ответы:
Первый параметр
.paste()
- это изображение для вставки. Вторые - это координаты, а секретный соус - третий параметр. Указывает маску, которая будет использоваться для вставки изображения. Если вы передаете изображение с прозрачностью, то альфа-канал используется в качестве маски.Проверьте документы .
источник
foreground.convert('RGBA')
параметр маски.ValueError: bad transparency mask
ValueError: bad transparency mask
использованиеbg.paste(fg, (0, 0), fg.convert('RGBA'))
Image.paste
не работает должным образом, когда фоновое изображение также содержит прозрачность. Вам нужно использовать настоящий альфа-композитинг .Подушка 2.0 содержит
alpha_composite
функцию, которая делает это.РЕДАКТИРОВАТЬ: оба изображения должны быть типа RGBA. Поэтому вам нужно вызывать их,
convert('RGBA')
если они имеют палитру и т. Д. Если фон не имеет альфа-канала, вы можете использовать обычный метод вставки (который должен быть быстрее).источник
ValueError: image has wrong made
, а @DenizOzgerКак уже указывало olt ,
Image.paste
не работает должным образом, когда источник и пункт назначения содержат альфа.Рассмотрим следующий сценарий:
Два тестовых изображения, оба содержат альфа:
Компоновка изображения осуществляется
Image.paste
так:создает следующее изображение (альфа-часть наложенных красных пикселей полностью взята со 2-го слоя. Пиксели не смешаны правильно):
Компоновка изображения осуществляется
Image.alpha_composite
так:производит следующее (правильное) изображение:
источник
alpha_composite
не можете установить смещение, не могли бы вы привести пример полной заменыpaste
функции?Можно также использовать смешивание:
источник
источник
У меня был похожий вопрос, и он не мог найти ответ. Следующая функция позволяет вставить изображение с параметром прозрачности поверх другого изображения с определенным смещением.
источник
ValueError: images do not match
Я закончил тем, что кодировал себя предложение этого комментария сделанным пользователем @ P.Melch и предложенным @Mithril для проекта, над которым я работаю.
Я также написал код безопасности, вот код для него . (Я связал конкретный коммит, потому что в будущем этот репозиторий может измениться)
Примечание. Я ожидаю, что на изображениях будут использоваться массивы, такие
np.array(Image.open(...))
как входы A и Bcopy_from
и эта связанная функцияoverlay
аргументы .Зависимости - это функция непосредственно перед ней,
copy_from
метод и массивы numpy в качестве содержимого изображения PIL для нарезки.Хотя файл ориентирован на классы, если вы хотите использовать эту функцию
overlay_transparent
, не забудьте переименоватьself.frame
массив в фоновый рисунок.Или вы можете просто скопировать весь файл (возможно, удалить некоторые импорта и
Utils
класс) и взаимодействовать с этим классом Frame следующим образом:Затем у вас есть
background.frame
наложенный и альфа-составной массив, вы можете получить из него изображение PIL с помощьюoverlayed = Image.fromarray(background.frame)
или что-то вроде:Или так же,
background.save("save path")
как это берет непосредственно из внутренней альфа-композицииself.frame
переменной .Вы можете прочитать файл и найти какие - то другие функции хорошо с этой реализацией I закодированной как и методы
get_rgb_frame_array
,resize_by_ratio
,resize_to_resolution
,rotate
,gaussian_blur
,transparency
,vignetting
:)Возможно, вы захотите удалить
resolve_pending
метод, так как он специфичен для этого проекта.Рад, что я помог вам, обязательно ознакомьтесь с репозиторием проекта, о котором я говорю, этот вопрос и тема очень помогли мне в разработке :)
источник