使用到的版本:

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);
}


参考资料:

https://github.com/lvgl/lvgl/issues/6678

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐