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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:13:16