2011-03-16 39 views
94

我有一個透明的PNG圖像「foo.png」 ,我已經打開了一個圖像與如何使用PIL

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

另一個圖像合併透明PNG圖像,我需要的是合併FOO .png與foo2.png。

(foo.png包含一些文字,我想打印foo2.png文本)

+35

不要在Python中使用';'命令的末尾:這很醜陋... – nosklo 2011-03-16 11:48:14

+1

我會在腦海中記住這些,謝謝! – Arackna 2011-03-16 12:39:57

回答

166
import Image 

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

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

第一個參數是.paste()粘貼圖像。其次是座標,祕密醬是第三個參數。它表示將用於粘貼圖像的蒙版。如果您傳遞帶有透明度的圖像,則Alpha通道將用作蒙版。

檢查docs

+4

哇!這樣可行 !!謝謝 – Arackna 2011-03-16 11:53:03

+5

我錯過了祕密醬油,謝謝! :D – 2011-10-31 10:42:34

+5

爲了確保前景在所有情況下都包含透明度,請使用'foreground.convert('RGBA')'作爲mask參數。 – 2012-10-04 02:28:51

45

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'),如果它們是調色板等。如果背景沒有alpha通道,那麼你可以使用常規的粘貼方法(應該更快)。

+0

我只是使用paste()將一個半透明圖像疊加到另一個半透明圖像上,使用PIL,並且它按照我的預期工作。它以什麼方式不按預期工作? – 2013-07-25 17:27:36

+3

@PeterHansen,paste()不能按預期工作「當背景圖像也包含透明度」。 – homm 2014-11-05 17:19:09

+1

@PeterHansen有例子:https://github.com/python-pillow/Pillow/issues/924#issuecomment-61848826 – homm 2014-11-05 17:53:55

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) 

會生成以下圖像(覆蓋的紅色像素的Alpha部分完全取自第二層。的像素不被正確地混合):使用Image.alpha_composite像這樣

enter image description here

合成圖像:

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

產生以下的(正確的)圖像:

enter image description here

+0

感謝您的截圖!真的有幫助! – Viet 2017-05-01 08:44:08

+0

但是'alpha_composite'不能設置偏移量,你介意給一個例子來完全替換'paste'函數嗎? – Mithril 2017-07-10 08:03:39

+0

我想你將不得不創建一個與garget圖像大小相同的新空白圖像,將圖層粘貼到適當的位置,並使用alpha_compositing將新圖像融合到目標圖像上。 – 2017-07-11 15:24:54

3

人們可以也可以使用混合:

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

這一個爲我辯護。圖像必須具有完全相同的大小,但沒關係。粘貼功能並沒有完全削減我的... – 2017-10-04 11:42:36