簡體   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