Как объединить прозрачное изображение PNG с другим изображением, используя PIL

У меня есть прозрачное изображение png "foo.png" и я открыл другое изображение с помощью

im = Image.open("foo2.png");

Теперь мне нужно объединить foo.png с foo2.png.

(foo.png содержит некоторый текст, и я хочу напечатать этот текст на foo2.png)

117 голосов | спросил Arackna 16 MarpmWed, 16 Mar 2011 14:33:59 +03002011-03-16T14:33:59+03:0002 2011, 14:33:59

5 ответов


0
import Image

background = Image.open("test1.png")
foreground = Image.open("test2.png")

background.paste(foreground, (0, 0), foreground)
background.show()

Первый параметр для .paste() - это изображение для вставки. Вторые - это координаты, а секретный соус - третий параметр. Это указывает на маску , которая будет использоваться для вставки изображения. Если вы передаете изображение с прозрачностью, то в качестве маски используется альфа-канал.

Проверьте документы .

ответил nosklo 16 MarpmWed, 16 Mar 2011 14:48:21 +03002011-03-16T14:48:21+03:0002 2011, 14:48:21
0

Image.paste не работает должным образом, когда фоновое изображение также содержит прозрачность. Вам нужно использовать настоящий альфа-составление .

Подушка 2.0 содержит функцию alpha_composite, которая делает это.

background = Image.open("test1.png")
foreground = Image.open("test2.png")

Image.alpha_composite(background, foreground).save("test3.png")

РЕДАКТИРОВАТЬ: оба изображения должны быть типа RGBA. Поэтому вам нужно вызвать convert('RGBA'), если они имеют палитру и т. Д. Если фон не имеет альфа-канала, вы можете использовать обычный метод вставки (который должен быть быстрее).

ответил olt 10 AMpWed, 10 Apr 2013 11:45:28 +040045Wednesday 2013, 11:45:28
0

Как уже было указано olt , Image.paste не работает должным образом, когда источник и пункт назначения содержит альфа.

Рассмотрим следующий сценарий:

Два тестовых изображения, оба содержат альфа:

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

 layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")

Компоновка изображения с использованием Image.paste примерно так:

 final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)

создает следующее изображение (альфа-часть наложенных красных пикселей полностью взята со 2-го слоя. Пиксели не смешаны правильно):

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

Компоновка изображения с использованием Image.alpha_composite примерно так:

 final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)

создает следующее (правильное) изображение:

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

ответил P.Melch 20 AMpThu, 20 Apr 2017 11:50:41 +030050Thursday 2017, 11:50:41
0

Можно также использовать смешивание:

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
ответил nvd 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 08 Sep 2017 14:19:51 +0300 2017, 14:19:51
0

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

import Image

def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
    fg_img_trans = Image.new("RGBA",fg_img.size)
    fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
    bg_img.paste(fg_img_trans,box,fg_img_trans)
    return bg_img

bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
ответил lee 7 FriEurope/Moscow2018-12-07T07:25:26+03:00Europe/Moscow12bEurope/MoscowFri, 07 Dec 2018 07:25:26 +0300 2018, 07:25:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132