我想用Python Image Library将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)
答案 0 :(得分:14)
经过网上搜索,这里是完成我要求的代码:
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(),因而在我的os / python / pil版本上崩溃了。 (看起来这是PIL中的错误。)
答案 1 :(得分:2)
不要使用PIL生成调色板,因为它无法正确处理RGBA并且量化算法非常有限。
请改用pngquant。
答案 2 :(得分:1)
如Mark Ransom所述,您的古色图片只有一个透明度级别。
保存您的古色古香的图像时,您必须指定您想要成为透明色的颜色索引,如下所示:
im.save("logo_py.png", transparency=0)
将图像保存为古色,并将第一种颜色用作透明色。
答案 3 :(得分:1)
这是一个古老的问题,因此也许较旧的答案已调整为较旧的PIL版本?
但是对于任何一个使用Pillow>=6.0.0
的人来说,下面的答案会更快更简单。
im = Image.open('png32_or_png64_with_alpha.png')
im = im.quantize()
im.save('png8_with_alpha_channel_preserved.png')