ESP32 中使用LVGL显示FATFS中的图片无法显示的解决办法
摘要:在LVGL V9.2图像处理中,频繁出现日志 image_decoder_get_info: Image decoder didn't set strid导致设备重启的问题。通过分析发现,问题源于局部变量使用、内存分配及数据指针设置不当。解决方案采用全局变量存储图像数据,正确初始化lv_draw_buf_t结构体,并确保图像数据指针正确指向。关键改进包括:全局缓冲区分配、静态draw_buf
使用到的版本:
idf:V 5.4.1
LVGL:V 9.2
打开LVGL的log功能:
打印如下:
[Info] image_decoder_get_info: Image decoder didn't set stride. Calculate it from width.
[Info] image_decoder_get_info: Image decoder didn't set stride. Calculate it from width.
[Info] image_decoder_get_info: Image decoder didn't set stride. Calculate it from width.
[Info] image_decoder_get_info: Image decoder didn't set stride. Calculate it from width.
......非常频繁的打印,甚至导致设备重启
无法显示分析:
1、使用的图像描述结构体是局部的,需要修改静态或者全局变量
2、没有成功开辟空间
3、.data的指针指向不对
4、图像数据不对
解决版:
// 从文件加载图像并使用LVGL v9方法显示
void load_image_from_file(lv_obj_t* parent, const char* path) {
FILE* fp = fopen(path, "rb");
if (!fp) {
log_e("无法打开文件: %s", path);
return;
}
// 获取文件大小
fseek(fp, 0, SEEK_END);
long file_size = ftell(fp);
fseek(fp, 0, SEEK_SET);
// 分配缓冲区
message_buf = (uint8_t*)malloc(file_size); //message_buf 是全局变量
if (!message_buf) {
log_e("内存分配失败: %ld bytes", file_size);
fclose(fp);
return;
}
// 读取文件内容
size_t read_size = fread(message_buf, 1, file_size, fp);
fclose(fp);
log_d("读取文件长度: %d", file_size);
if (read_size != file_size) {
log_e("读取文件不完全: %s", path);
free(message_buf);
return;
}
// 使用LVGL v9方法设置图像
static lv_draw_buf_t draw_buf;
lv_draw_buf_init(&draw_buf,
480, // 图像宽度
800, // 图像高度
LV_COLOR_FORMAT_RGB565, // 颜色格式
480 * 2, // 步幅
message_buf, // 图像数据
file_size); // 数据大小
//ps:img_480_800_16是全局变量
lv_draw_buf_to_image(&draw_buf, &img_480_800_16); //设置图片源数据
// 创建图像对象并设置源
lv_obj_t* img = lv_image_create(parent);
lv_image_set_src(img, &img_480_800_16);
}
参考资料:
更多推荐



所有评论(0)