Arduino生成RGB565格式HEX字符串转RGB图像失败求助
解决RGB565十六进制数据转可本地打开的RGB图像问题
问题核心
设备返回的是RGB565编码的原始像素数据,并非PNG这类压缩图像格式的二进制流。直接把原始字节写入.png文件,本地图像阅读器无法识别(RAW Pixels支持直接解析原始像素数据,所以能正常显示)。RGB565格式下每个像素占2字节,按R5-G6-B5的位分布存储,必须先转成标准8位RGB格式,再封装为图像文件。
解决方案代码
使用Python结合numpy和Pillow库完成转换,步骤清晰可执行:
import numpy as np from PIL import Image # 读取十六进制数据文件 with open('img.txt', 'r') as f: hex_data = f.read().strip() # 移除开头可能存在的"0x"前缀,转为字节数组 if hex_data.startswith('0x'): hex_data = hex_data[2:] byte_data = bytes.fromhex(hex_data) # 将字节数据解析为RGB565格式的16位整数数组,重塑为320x240的像素矩阵 rgb565_array = np.frombuffer(byte_data, dtype=np.uint16).reshape((240, 320)) # 从RGB565中提取分量并转换为8位RGB格式 r = ((rgb565_array >> 11) & 0x1F) << 3 # 5位R左移3位补全8位 g = ((rgb565_array >> 5) & 0x3F) << 2 # 6位G左移2位补全8位 b = (rgb565_array & 0x1F) << 3 # 5位B左移3位补全8位 # 合并为标准RGB数组,转为图像并保存 rgb_array = np.stack([r, g, b], axis=-1).astype(np.uint8) img = Image.fromarray(rgb_array) img.save('output.png')
关键步骤说明
numpy.frombuffer:直接把字节数据转为16位无符号整数数组,对应RGB565的单个像素值。- 位运算转换:RGB565的5/6位分量通过左移补位,扩展为8位的标准RGB分量(比如5位R的最高位对应8位R的第7位,左移3位填充低位为0)。
Pillow.Image.fromarray:将numpy生成的RGB数组转为图像对象,保存为PNG后即可被本地图像阅读器正常识别。
验证结果
运行代码后生成的output.png可直接在本地图像查看器打开,显示效果与RAW Pixels一致。
内容的提问来源于stack exchange,提问作者Gdy
相关产品推荐
相关产品推荐

