繁体   English   中英

使用 PIL 将 PNG32 转换为 PNG8,同时保持透明度

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM