Pillow转灰度热力图为Zissou1彩色图报PixelAccess无putpixel错误
报错原因与修复方案
错误产生原因
- API调用逻辑错误:Pillow库中通过
Image.load()方法获取的PixelAccess像素访问对象,仅支持通过[x, y]下标语义直接读写像素值,本身不存在putpixel方法。putpixel是Image类的实例方法,仅能在Image实例对象上调用,不能在PixelAccess实例上调用。 - 像素取值索引错误:带透明通道的8位灰度PNG在Pillow中默认以
LA模式加载,单像素返回的元组结构为(灰度值, Alpha透明度值),原代码取元组索引[1]拿到的是透明度值,并非用于匹配调色板的灰度值,即使解决了方法调用错误,也会触发字典键匹配失败的问题。 - 遍历逻辑兼容性差:原代码硬编码循环范围为0-255,仅能适配恰好256x256尺寸的图像,批量处理时只要遇到尺寸不符的文件就会触发越界报错。
- 透明通道保留逻辑缺失:原代码直接使用HEX颜色转换后的RGBA值写入新图,若HEX色值为6位不透明格式,会直接丢弃原图的透明通道效果,不符合需求。
修复后代码
import os from PIL import Image, ImageColor ### dic = 提前构造的调色板字典,格式为{灰度像素值: "HEX颜色码"} with Image.open("3.png") as im: # 统一转换为LA模式,消除不同源文件的模式差异 im = im.convert("LA") fin = Image.new("RGBA", im.size) src_px = im.load() dst_px = fin.load() width, height = im.size for x in range(width): for y in range(height): gray_val, alpha_val = src_px[x, y] # 匹配调色板得到对应RGB值 target_r, target_g, target_b, _ = ImageColor.getcolor(dic[gray_val], "RGBA") # 直接通过下标写入像素,保留原图的Alpha透明度 dst_px[x, y] = (target_r, target_g, target_b, alpha_val) fin.show() # 需要保存结果时取消注释下行 # fin.save("converted_3.png")
批量处理时,只需要遍历目标目录下所有png文件,替换上述代码中的输入路径即可;如果调色板字典未覆盖0-255全部灰度值,可提前增加灰度值就近映射的容错逻辑,避免触发KeyError。
内容的提问来源于stack exchange,提问作者metamorporpoise
相关产品推荐
相关产品推荐

