Python PIL:创建具有透明背景的索引颜色图像

5

我想知道如何创建具有透明背景和仅使用2种索引颜色(红色和蓝色)以最小化文件大小的图像?

更具体地说,我有两张黑白图片想要转换,一张变成透明和蓝色,另一张变成透明和红色。然后我想要合并这两张图片。我可以用常规的RGBA图像来完成,但我真的希望将颜色索引化以尽可能减少文件大小。

最好使用PIL,但其他Python库也可以。

2个回答

7

我设法使用了“调色板”图像类型来完成它,但生成的文件并不像我预期的那么小...以下是我的代码,如果对其他人有用,或者有人可以改进它,可以参考一下。

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

从你的问题中,我认为你想要完全的8位透明度,而不是1个透明颜色。当然,这很容易! - Mark Ransom

2
一旦合并两张图片,您将不再拥有两种颜色 - 颜色会根据每个像素位置上的透明度相结合。最坏的情况下,您将拥有256*256=65536种颜色,无法索引,如果进行压缩也不会压缩得很好。
我建议使用PNG格式保存,并让无损压缩尽其所能。

哎呀,我能否制作一个带有透明背景且只有一种颜色索引的图像? - Tickon
@Tickon,PIL可以让你在PA模式下创建图像,但它不允许你保存它。我真的认为你应该将它保存为RGBA,如果你真的需要更小的尺寸,可以使用专门用于此任务的实用程序。 - Mark Ransom
我找到了一种保存带透明度的P模式图像的方法,请查看我的答案。 - Tickon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接