如何使用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
相关产品推荐
相关产品推荐

