Как слить прозрачный png-образ с другим изображением с помощью PIL

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

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

теперь мне нужно слить foo.png с foo2.png.

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

Ответ 1

import Image

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

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

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

Проверьте docs.

Ответ 2

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

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

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

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

EDIT: Оба изображения должны быть типа RGBA. Поэтому вам нужно вызвать convert('RGBA'), если они палированы и т.д. Если фон не имеет альфа-канала, вы можете использовать обычный метод пасты (который должен быть быстрее).

Ответ 3

Как уже указывал 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)

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

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

Сопоставление изображения с помощью Image.alpha_composite следующим образом:

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

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

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

Ответ 4

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

im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")

Ответ 5

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

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()

Ответ 6

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