You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PIL移除调色板中未使用的冗余黑色?

关于PIL转换P模式后调色板存在未使用黑色槽位的问题

现象是否正常?

这是正常行为。PNG格式的索引调色板通常会被填充到2的幂次长度(最常见的是256位),PIL在执行convert("P", palette=Image.ADAPTIVE, colors=N)时,会用黑色(RGB(0,0,0))填充未使用的调色板槽位,这一操作符合PNG格式规范。像Aseprite这类工具会完整显示调色板的所有槽位,哪怕其中大部分未被实际使用,所以你会看到255个额外的黑色条目。

如何移除未使用的黑色槽位?

可以通过手动提取实际使用的颜色,重新生成仅包含有效颜色的调色板来解决。以下是具体实现代码:

from PIL import Image
from PIL.ImagePalette import Palette

# 创建1x1红色RGB图像
img = Image.new("RGB", (1, 1), (255, 0, 0))
# 转换为自适应调色板的P模式
img_p = img.convert("P", palette=Image.ADAPTIVE, colors=1)

# 获取图像中实际使用的像素索引
used_indices = set(img_p.getdata())
# 提取原调色板中对应索引的颜色
original_palette = img_p.getpalette()
used_colors = []
for idx in used_indices:
    color_start = idx * 3
    used_colors.append(tuple(original_palette[color_start:color_start+3]))

# 创建仅包含有效颜色的自定义调色板
custom_palette = Palette(mode="RGB", colors=used_colors)
# 生成新的P模式图像并设置调色板
clean_img = Image.new("P", img_p.size)
clean_img.putdata(img_p.getdata())
clean_img.putpalette(custom_palette)

# 保存处理后的图像
clean_img.save("test_clean.png")

这段代码会提取图像实际用到的颜色,生成仅包含该颜色的调色板,最终保存的PNG文件中,调色板仅包含红色,Aseprite打开后不会显示额外的黑色槽位。

内容的提问来源于stack exchange,提问作者Lurgypai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 18:30:25