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

如何将C++ Buffer中的PNG转换为十六进制格式用于LVGL显示

问题场景

从OpenWeatherMap获取PNG格式的气象瓦片图,代码如下:

String zoom = "5";   // 测试值
String xmap = "30";  // 需要根据实际调整
String ymap = "30";
String serverPathMap = "http://tile.openweathermap.org/map/precipitation_new/" + 
zoom + "/" + xmap + "/" + ymap + ".png?" + "APPID=" + openWeatherMapApiKey;

通过jsonBuffer = httpGETRequest(serverPathMap.c_str());将PNG二进制数据存入String类型的jsonBuffer,已验证数据正确,但需要将其转换为可在Squareline Studio生成的图像占位符ui_OpenWeatherMap上显示的格式。尝试过直接打印、snprintf转换、直接传入lv_image_set_src等方法均无效。

解决方案

不需要将二进制数据转换为静态十六进制数组格式,LVGL支持直接从内存加载二进制PNG数据,具体步骤如下:

  • 提取二进制数据:String存储的是PNG的原始二进制内容,直接获取其数据指针和长度即可,无需额外转换
  • 创建LVGL图像描述符:定义lv_img_dsc_t结构体,填充PNG数据的相关信息
  • 绑定到图像控件:将图像描述符设置为目标控件的数据源

示例代码:

// 1. 从String中提取PNG二进制数据
const uint8_t* png_data = reinterpret_cast<const uint8_t*>(jsonBuffer.c_str());
size_t png_data_len = jsonBuffer.length();

// 2. 定义LVGL图像描述符
static lv_img_dsc_t weather_map_img = {
    .header.always_zero = 0,
    .header.w = 256,  // OpenWeatherMap瓦片图固定为256x256
    .header.h = 256,
    .data_size = png_data_len,
    .header.cf = LV_IMG_CF_PNG,
    .data = png_data
};

// 3. 将图像设置到Squareline生成的控件上
lv_image_set_src(ui_OpenWeatherMap, &weather_map_img);
关键说明
  • OpenWeatherMap的瓦片图默认是256x256分辨率,所以描述符中的宽高可以固定设置为256
  • 若httpGETRequest返回的String包含HTTP响应头等非二进制内容,需先剥离响应头,只保留PNG文件的原始二进制数据
  • 若需要动态更新图像,每次获取新数据后更新weather_map_img的data和data_size字段,再调用lv_image_set_src刷新控件

内容的提问来源于stack exchange,提问作者Jason Trumbower

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:52:01