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

