it-swarm.com.ru

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

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

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

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

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

119
Arackna
import Image

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

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

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

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

211
nosklo

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

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

53
olt

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

35
P.Melch

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

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

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

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()
0
lee
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
陈旭周记