2011-10-11 209 views
4

我想知道如何使用透明背景創建圖像,並且只有兩種索引顏色(紅色和藍色)可以最大限度地減小文件大小?Python PIL:創建帶有透明背景的索引彩色圖像

更具體地說,我有兩個黑白圖像,我想轉換,一個透明和藍色,另一個透明和紅色。然後我想合併這兩張圖片。我可以用普通的RGBA圖像來做到這一點,但我真的希望將顏色編入索引以最小化文件大小。

理想情況下與PIL,但其他Python庫也可以工作。

回答

3

所以我設法做到了,使用「調色板」圖像類型,但生成的文件沒有我期望的那麼小... 這是我的代碼,以防其對別人有用,或者如果有人可以改進它。

from PIL import Image 

im = Image.open("image1.png") 
imP = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=3) 
imP.putpalette([ 
    0, 0, 0, # index 0 is black background 
    0, 0, 255, # index 1 is blue 
    255, 0, 0, # index 2 is red ]) 

im2 = Image.open("image2.png") 
imP2L = im2.convert('L') # need a greyscale image to create a mask 
mask = Image.eval(imP2L, lambda a: 255 if a == 0 else 0) 
imP.paste(2, mask) # Paste the color of index 2 using image2 as a mask 
imP.save('out3.png', transparency = 0, optimize = 1) # Save and set index 0 as transparent 
+0

從你的問題我想你想要完整的8位透明度,而不是1個透明的顏色。當然這很簡單! –

0

一旦合併了這兩幅圖像,就不會再有兩種顏色 - 顏色將根據每個像素位置上每幅圖像的透明度進行組合。最糟糕的情況是,你將擁有256 * 256 = 65536種顏色,這些顏色不能被索引,如果你這樣做的話不會很好壓縮。

我會建議保存爲PNG,並讓無損壓縮盡其所能。

+0

Humm,我可以用透明背景製作圖像,只有1種顏色索引? – Tickon

+0

@Tickon,PIL將允許你在'PA'模式下創建一個圖像,但它不會讓你保存它。我真的認爲你應該將它保存爲'RGBA',如果你真的需要它更小,使用專用於該任務的實用程序。 –

+0

我找到了一種方法來保存具有透明度的P模式圖像,請參閱我的答案。 – Tickon