Skip to content

LVGL JPEG 解码说明

目录


概述

本文档描述了在 LVGL 应用中,如何使用内置 C 文件方式加载和显示 JPEG 图片。该方案将 JPEG 图片编译为 C 文件,通过 LVGL 的 JPEG 解码器进行解码显示。

项目 说明
支持格式 JPG / JPEG 格式图片
实现方式 编译时将 JPEG 转换为 C 文件,运行时解码显示
适用场景 需要显示高质量背景图或静态图片的 LVGL 应用

快速入门

使用步骤

  1. 放置图片:将你的 JPEG 文件放入 resource/image/ 目录,如文件名xiaozhi_background.jpeg
  2. 编译项目:CMake 自动将 JPEG 转换为 C 文件
  3. 代码调用:在代码中声明并使用图片变量xiaozhi_background
// 声明外部图片变量(变量名与文件名对应)
extern const lv_image_dsc_t your_image_name;

// 创建图片控件并设置图片源
lv_obj_t *img = lv_image_create(scr);
lv_image_set_src(img, &your_image_name);

编译命令

.\build.bat YM310_W09C.A60 xiaozhi_v2_lcd

实现原理

工作流程

┌─────────────────────────────────────────────────────────────┐
│                       编译阶段                              
├─────────────────────────────────────────────────────────────┤
  JPEG 文件 ──→ LVGLImage.py ──→ C 文件 (RAW 格式)            
└─────────────────────────────────────────────────────────────┘
                              ↓
┌─────────────────────────────────────────────────────────────┐
                        运行阶段                              
├─────────────────────────────────────────────────────────────┤
  lv_init()              → 初始化 LVGL                        
       ↓                                                     
  lv_yopen_jpeg_init()   → 注册 JPEG 解码器                   
       ↓                                                     
  lv_image_set_src()     → 设置图片源                         
       ↓                                                     
  JPEG 解码器自动解码    → 显示图片                            
└─────────────────────────────────────────────────────────────┘

技术要点

  • 编译时转换:使用 LVGL 官方工具 LVGLImage.py 将 JPEG 转换为 C 文件
  • RAW 格式保留:保持原始 JPEG 数据不变,由运行时解码器处理
  • 按需解码:LVGL 在显示时自动调用 JPEG 解码器进行解码

详细实现

代码实现

1. JPEG 解码器初始化

_ui_task 函数中,lv_init() 之后添加解码器初始化:

/* LVGL 初始化 */
lv_init();

/* 初始化 JPEG 解码器 */
extern void lv_yopen_jpeg_init(void);
lv_yopen_jpeg_init();
yopen_trace("ui: jpeg decoder initialized");

文件位置xiaozhi_ui.c

2. 背景图显示

在 UI 初始化中创建图片控件并显示背景图:

// 创建背景图控件
lv_obj_t *background = lv_image_create(scr);
lv_image_set_src(background, &xiaozhi_background);
lv_obj_set_width(background, DISP_HOR_RES);
lv_obj_set_height(background, DISP_VER_RES);
lv_obj_set_pos(background, 0, 0);

文件位置xiaozhi_ui.c


编译配置

通过 CMake 自动将 JPEG 文件转换为 C 文件,在 CMakeLists.txt 中添加:

# 查找 image 目录下的所有 JPEG 文件
file(GLOB JPEG_FILES "${CURRENT_CMAKE_DIR}/resource/image/*.jpeg" "${CURRENT_CMAKE_DIR}/resource/image/*.jpg")

foreach(JPEG_FILE ${JPEG_FILES})
    get_filename_component(JPEG_NAME ${JPEG_FILE} NAME_WE)
    set(OUTPUT_C_FILE "${PROJECT_BINARY_DIR}/${JPEG_NAME}.c")
    set(LVGL_IMAGE_TOOL ${YOPEN_TOP_DIR}/components/lvgl-9.4.0/scripts/LVGLImage.py)

    # 使用 RAW 格式保留原始 JPEG 数据
    add_custom_command(
        OUTPUT ${OUTPUT_C_FILE}
        COMMAND python ${LVGL_IMAGE_TOOL} --cf RAW --ofmt C -o ${PROJECT_BINARY_DIR} --name ${JPEG_NAME} ${JPEG_FILE}
        MAIN_DEPENDENCY ${JPEG_FILE}
        COMMENT "Converting JPEG: ${JPEG_FILE}"
    )

    target_sources(${target} PRIVATE ${OUTPUT_C_FILE})
    target_include_directories(${target} PRIVATE ${PROJECT_BINARY_DIR})
endforeach()

文件位置CMakeLists.txt

参数说明

参数 说明
--cf RAW 颜色格式,保留原始 JPEG 数据
--ofmt C 输出格式为 C 文件
--name {JPEG_NAME} 生成的变量名(与文件名对应)

效果展示

预期效果

  • JPEG 图片正确解码并显示在屏幕上
  • 图片颜色正常,无偏色或失真
  • 全屏背景显示,覆盖整个屏幕区域

附录

文件结构

app/xiaozhi/
├── src/
│   └── xiaozhi_ui.c                    # UI 实现
├── CMakeLists.txt                      # CMake 配置
└── resource/
    └── image/
        └── xiaozhi_background.jpeg     # JPEG 图片资源

components/lvgl-9.4.0/
├── scripts/
│   └── LVGLImage.py                    # 图片转换工具
└── src/libs/yopen_jpeg/
    ├── lv_yopen_jpeg.c                 # JPEG 解码器实现
    └── lv_yopen_jpeg.h                 # JPEG 解码器接口

依赖模块

模块 路径 说明
LVGL components/lvgl-9.4.0 图形库核心
yopen_jpeg components/lvgl-9.4.0/src/libs/yopen_jpeg JPEG 解码器
lcd components/lcd LCD 驱动