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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:54:05