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

CircuitPython读取BMP文件时如何避免字节自动解码获取原始字节

问题根源澄清

  • 你读到的b'...J...'和十六进制编辑器里的0x4A没有任何差异,这是Python字节串的正常打印规则:可打印的ASCII范围内的字节(0x20~0x7E)会直接显示对应的字符,不会显示\x转义格式。J对应的十六进制值就是0x4A,不存在自动解码、字节被篡改的情况,你读取到的就是原始文件字节。
  • 程序崩溃的核心原因是displayio.Palette的元素需要接收的是整数类型的RGB颜色值,你直接传入拼接后的字节串不符合参数要求。

修复方案

你只需要把拼接得到的4字节(实际用RGB三个通道即可)转换成整数再赋值给调色板就行,修改后的代码如下:

palette = displayio.Palette(2)
with open("images/f.bmp", "rb") as f:
    f.seek(137)
    for val in range(0, 1):
        try:
            c_bytes = f.read(4)
            # BMP调色板条目是BGRA顺序,转成RGB对应的24位整数
            # 取B、G、R三个通道,拼接成0xRRGGBB格式的整数
            r = c_bytes[2]
            g = c_bytes[1]
            b = c_bytes[0]
            palette[0] = (r << 16) | (g << 8) | b
            # 调试打印可以转成十六进制看原始值
            print(f"读取到的颜色值:{hex(palette[0])}")
        except Exception as e:
            print(e)

补充说明

  • 如果你的BMP是16位色或者其他格式,只需要对应调整通道的位移逻辑即可。
  • 如果你要验证读取的字节是否正确,可以直接打印每个字节的十六进制值:print([hex(i) for i in c_bytes]),就能看到和十六进制编辑器完全一致的结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 04:03:03