使用PIL将PNG32转换为PNG8并保留透明度
我想用Python图像库把一个带透明背景的PNG32图片转换成PNG8格式。到目前为止,我已经成功地把它转换成了有实心背景的PNG8。
下面是我正在做的事情:
from PIL import Image
im = Image.open("logo_256.png")
im = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
im.save("logo_py.png", colors=255)
4 个回答
1
这个问题比较老了,所以可能以前的回答是针对旧版本的PIL?
不过对于使用
im = Image.open('png32_or_png64_with_alpha.png')
im = im.quantize()
im.save('png8_with_alpha_channel_preserved.png')
1
正如Mark Ransom提到的,你的调色板图像只能有一个透明度。
在保存你的调色板图像时,你需要指定哪个颜色索引是你想要的透明颜色,像这样:
im.save("logo_py.png", transparency=0)
这样可以将图像保存为调色板颜色,并将第一个颜色设置为透明颜色。
16
经过在网上的多次搜索,这里是实现我所要求功能的代码:
from PIL import Image
im = Image.open("logo_256.png")
# PIL complains if you don't load explicitly
im.load()
# Get the alpha band
alpha = im.split()[-1]
im = im.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)
# Set all pixel values below 128 to 255,
# and the rest to 0
mask = Image.eval(alpha, lambda a: 255 if a <=128 else 0)
# Paste the color of index 255 and use alpha as a mask
im.paste(255, mask)
# The transparency index is 255
im.save("logo_py.png", transparency=255)
来源:http://nadiana.com/pil-tips-converting-png-gif。虽然那里的代码没有调用 im.load(),所以在我使用的操作系统/python/pil 版本上会崩溃。(看起来这是 PIL 的一个 bug)。