2011-03-16 2 views
94

У меня есть прозрачный PNG изображения «foo.png» и я открыл еще одно изображение сКак слить прозрачный PNG изображение с другим изображением, используя PIL

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

теперь, что мне нужно, чтобы объединить Foo .png с foo2.png.

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

+35

Не используйте ';' в конце ваших команд в python: это уродливо ... – nosklo

+1

Я сохраню это в своем уме, спасибо! – Arackna

ответ

166
import Image 

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

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

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

Проверьте docs.

+4

wow !! это работает !! спасибо – Arackna

+5

Мне не хватает секретного соуса, спасибо! : D –

+5

Чтобы убедиться, что передняя панель содержит прозрачность во всех случаях, используйте 'foreground.convert ('RGBA')' для параметра mask. –

45

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

+0

Я просто использовал paste(), чтобы наложить одно полупрозрачное изображение на другое, с PIL, и это сработало, как я ожидал. Как он работает, как вы ожидали? –

+3

@PeterHansen, paste() не работает должным образом ", когда фоновое изображение также содержит прозрачность". – homm

+1

@PeterHansen Пример: https://github.com/python-pillow/Pillow/issues/924#issuecomment-61848826 – homm

17

Как 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) 

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

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

+0

Спасибо за скриншоты! Действительно помогает! – Viet

+0

Но 'alpha_composite' не может установить смещение, не могли бы вы привести пример, чтобы полностью заменить функцию' paste'? – Mithril

+0

Я предполагаю, что вам нужно будет создать новое пустое изображение с таким же размером, как изображение сглаживания, вставьте слой в нужное положение и используйте alpha_compositing для смешивания нового изображения над целевым изображением. –

3

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

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

Этот аскетически работал на меня. Изображения должны иметь точно такой же размер, но это нормально. Функция пасты не совсем разрезала мне ... –

Смежные вопросы