2017-02-28 137 views
10

我對Python很陌生,並且正在探索它允許用戶構建自定義圖像。這個想法是,客戶端會選擇一些選項,並在服務器上創建映像然後下載(或用於服務器端的其他事情)。使用透明度生成具有不同大小圖層的合成圖像

圖像由許多圖像組成,其中大部分圖像類型是不規則形狀且具有透明度的小圖標類型。所有圖層都是.png文件。

我試過使用枕頭,但它似乎需要與整體圖像相同的大小才能正確使用頂層的透明度。

這裏是我試過到目前爲止:

from PIL import Image 

background = Image.open("Background.png") 
foreground = Image.open("Trim.png") 
fire = Image.open("Type_Fire_Large.png") 

background = Image.alpha_composite(background, foreground) 
background.paste(fire, (150, 150)) 
background.show() 

圖像看起來是這樣的:

Layered image with black on overlay

Background.png是陰影的 「噪音」 和Trim.png是灰色的斜線。最好的部分:Trim.png的中心是透明的,並且能夠在中間顯示Background.png。但它也與圖像大小相同。

問題是Fire;注意那些黑色邊框(和奇怪的紫紅色圓點)。該文檔指出疊加圖像需要具有相同的尺寸。但是,這似乎是一種常見的情況,有人希望在另一幅圖像上放置一個帶有透明度的小圖標,並將它們組合成一幅圖像。

我沒有附屬於任何特定的圖書館,我很樂於接受想法和選擇。我試圖做的唯一事情就是保持簡單,所以創建一個完整的遊戲引擎或類似的東西來生成圖像可能會太多。

回答

4

要粘貼剛纔在另一個上面一個PNG,尊重透明度,儘量

background.paste(fire, (x,y), fire.convert("RGBA")) 
+0

這是令人驚訝的容易和種類的無證。謝謝! – Chris

+0

奇怪的fuscia點意味着PNG已經處於RGBA模式,您是如何解釋這一點的? –

+0

@MarkRansom我只是在帶alpha通道的png上做過Image.open(),並且注意到在我可以將它用作掩碼之前,RGBA轉換仍然是必需的。 –

2

首先我想說的約翰內斯·霍姆伯格已經回答了你的主要關注:缺少透明度。

但我希望解釋一下它是關於與奇怪的紫紅色斑點

透明彩色圖像通常存儲爲RGBA(RGB紅,綠,藍和A Alpha)。這裏Alpha定義了從透明到完全透明的透明度。

以正確的方式疊加圖像,我們看到GIMP徽標,但彩色條紋幾乎看不見 - 因爲它(幾乎)是透明的。

Using RGBA

但是 - 因爲每個像素可能是可能可見的 - 像素系統仍然有顏色。即使是那些透明度爲100%的像素。因此,如果我們不考慮Alpha,我們會看到沒有透明度的每個像素顏色。這樣,我們可能會產生令人不安的顏色,只要它們是完全透明的,通常都不會令人不安。

enter image description here

+0

這個圓點讓我想起了當時我與杜克Nukem 3D混淆的日子,他們用紫紅色作爲二維精靈中的顏色。即使它們是透明的,它們也具有顏色是合理的。我認爲這個點是保存的一部分,或者是在我把它變成透明之前的那種顏色。謝謝澄清,現在我知道了! – Chris

相關問題