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

时间:2011-05-24 17:39:50

标签: python png python-imaging-library

我想用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)

4 个答案:

答案 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')