[英]Converting PNG32 to PNG8 with PIL while preserving transparency
我想使用 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)
在网上大量搜索后,这里是完成我要求的代码:
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 中的错误)。
不要使用 PIL 生成调色板,因为它无法正确处理 RGBA 并且量化算法非常有限。
请改用pngquant 。
这是一个老问题,所以也许老的答案是针对老版本的 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')
正如 Mark Ransom 所提到的,您的调色图像将只有一个透明度级别。
保存调色板图像时,您必须指定要成为透明颜色的颜色索引,如下所示:
im.save("logo_py.png", transparency=0)
将图像保存为调色板 colors 并使用第一种颜色作为透明颜色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.