Python Pillow库putpixel()方法无法正确写入颜色问题求助
问题排查与修复方案
核心故障原因
直接导致读写结果不符合预期的问题有两个:
- 读取逻辑丢失末尾字符:
read方法的循环范围写为range(0, l1-1),Python的range是左闭右开区间,你写入时遍历了range(0, l1)覆盖全部l1个字符,读取时该范围只会取到前l1-1个字符,直接丢失最后一位,修复只需将循环范围改为range(0, l1)。 - 通道值溢出风险:RGB图像单个通道的取值范围是0~255的整数,你直接把字符串长度存在G、B通道,当待存储的字符串长度超过255时,写入的通道值会被强制截断,读取时拿到的长度是错误值,最终读取内容完全错乱。如果需要支持更长的字符串,可以将长度拆分到多个像素的通道存储,否则可以直接限制单条配置的长度不超过255字符。
其他可优化点
- 增加字符存在性校验:如果传入
edit方法的字符串包含不在laters列表中的字符,会直接抛出ValueError,建议提前校验或者增加缺省映射逻辑。 - 增加图片尺寸校验:写入前先判断图片宽度是否大于等于待写入的字符串长度,避免越界写入失败。
- 减少重复IO:如果需要多次读写同一张图片,建议缓存图片对象而不是每次方法调用都重新打开、保存图片,提升效率。
修复后的代码示例
from PIL import Image class CustomConfigReader: def __init__(self, path): self.configPath = path self.laters = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "A", "S", "D", "F", "G", "H", "J", "K", "L", "Z", "X", "C", "V", "B", "N", "M", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "a", "s", "d", "f", "g", "h", "j", "k", "l", "z", "x", "c", "v", "b", "n", "m", " ", ".", ",", "!", "?"] def edit(self, y, value): l1 = len(value) # 提前校验长度合法性 if l1 > 255: raise ValueError("单条配置长度不能超过255字符") # 提前校验字符合法性 for c in value: if c not in self.laters: raise ValueError(f"不支持的字符: {c}") configImage = Image.open(self.configPath).convert("RGB") # 校验图片宽度足够写入 if configImage.width < l1: raise ValueError("图片宽度不足,无法存储当前长度的配置") for i in range(l1): l3 = self.laters.index(value[i]) configImage.putpixel((i, y), (l3, l1, l1)) configImage.save(self.configPath) def read(self, y): configImage = Image.open(self.configPath).convert("RGB") l1 = configImage.getpixel((0, y))[1] # 校验读取到的长度合法性,避免异常报错 if l1 < 0 or l1 > configImage.width: return "" value = "" # 修复循环范围,读取全部字符 for i in range(l1): l3 = configImage.getpixel((i, y))[0] value += self.laters[l3] return value
内容的提问来源于stack exchange,提问作者Peach Studio
相关产品推荐
相关产品推荐

