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
相关产品推荐
相关产品推荐

