Python PIL: Create indexed color image with transparent background
我想知道如何创建具有透明背景和仅两种索引颜色(红色和蓝色)的图像以最小化文件大小?
更具体地说,我有两个要转换的黑白图像,一个转换为透明和蓝色,另一个转换为透明和红色。 然后,我想合并这两个图像。 我可以使用常规的RGBA图像来做到这一点,但我确实希望索引颜色以最大程度地减小文件大小。
理想情况下,使用PIL,但其他Python库也可以使用。
所以我设法做到了,使用"调色板"图像类型,但是生成的文件并不像我预期的那么小。
这是我的代码,以防它对其他人有用或有人可以对其进行改进。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
合并两个图像后,您将不再拥有两种颜色-这些颜色将根据每个像素位置的每个颜色的透明度进行组合。 最坏的情况是,您将拥有256 * 256 = 65536种颜色,这些颜色将无法索引,并且压缩效果不佳。
我建议另存为PNG,并让无损压缩发挥最大作用。