Как объединить прозрачное изображение PNG с другим изображением, используя PIL - PullRequest
130 голосов
/ 16 марта 2011

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

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

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

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

Ответы [ 6 ]

234 голосов
/ 16 марта 2011
import Image

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

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

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

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

55 голосов
/ 10 апреля 2013

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'), если они имеют палитру и т. Д. Если фон не имеет альфа-канала, вы можете использовать обычный метод вставки (который должен быть быстрее).

38 голосов
/ 20 апреля 2017

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

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

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

enter image description here enter image description here

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-го слоя. Пиксели не смешаны правильно):

enter image description here

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

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

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

enter image description here

8 голосов
/ 08 сентября 2017

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

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
0 голосов
/ 28 апреля 2019
def trans_paste(bg_img,fg_img,box=(0,0)):
    fg_img_trans = Image.new("RGBA",bg_img.size)
    fg_img_trans.paste(fg_img,box,mask=fg_img)
    new_img = Image.alpha_composite(bg_img,fg_img_trans)
    return new_img
0 голосов
/ 07 декабря 2018

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

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...