2011-10-11 207 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