Python PIL:创建带透明背景的索引彩色图像

5 投票
2 回答
8175 浏览
提问于 2025-04-17 04:07

我想知道怎么才能创建一个背景透明、只有两种颜色(红色和蓝色)的图片,这样可以尽量减小文件大小。

具体来说,我有两张黑白图片,我想把一张转换成透明的蓝色,另一张转换成透明的红色。然后我想把这两张图片合并在一起。我可以用普通的RGBA图片来做到这一点,但我其实更想用索引颜色,这样可以减小文件的大小。

最好是用PIL库,不过其他的Python库也可以。

2 个回答

2

一旦你把这两张图片合并在一起,你就不会再有两种颜色了——颜色会根据每个像素的透明度进行混合。最糟糕的情况是,你可能会得到256*256=65536种颜色,这些颜色无法被索引,而且如果你想压缩的话效果也不好。

我建议你保存为PNG格式,这样无损压缩可以发挥最大的效果。

8

我成功实现了这个功能,使用了“调色板”这种图片类型,但生成的文件大小并没有我想象中那么小……
这是我的代码,可能对其他人有用,或者如果有人能帮我改进一下也不错。

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

撰写回答