У меня есть прозрачное изображение 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)
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
Первым параметром .paste()
является изображение для вставки. Во-вторых, это координаты, а секретный соус - третий параметр. Он указывает маску , которая будет использоваться для вставки изображения. Если вы передаете изображение с прозрачностью, тогда альфа-канал используется как маска.
Проверьте docs.
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')
, если они палированы и т.д. Если фон не имеет альфа-канала, вы можете использовать обычный метод пасты (который должен быть быстрее).
Как уже указывал 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)
выводит следующее (правильное) изображение:
Можно также использовать смешение:
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
Имел подобный вопрос и с трудом находил ответ. Следующая функция позволяет вставить изображение с параметром прозрачности поверх другого изображения с определенным смещением.
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()
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