libjpeg-turbo 编解码并显示示例

本示例演示如何使用 libjpeg-turbo 库在嵌入式系统中进行 JPEG 图像的编码和解码, 并在 LCD 上显示。

支持的开发板与显示接口:

  • arcs_evb:SPI ST7789P3,分辨率 240x320

  • venusa_rd_evb:RGB ST7701S,分辨率 480x800

两块开发板使用独立的内置 JPEG 图片:

  • arcs_evb 保留 320x240 横图,显示端旋转后适配 240x320 屏幕。

  • venusa_rd_evb 使用 800x480 横图,显示端旋转后填满 480x800 帧缓冲,屏幕横放时图像方向正常。

arcs_evb 继续使用原有的 src/sample_jpeg.hvenusa_rd_evb 编译时由 CMake 将 800x480 JPEG 转换为 build/generated/jpeg_turbo_show/sample_jpeg_venusa.h,该生成文件不需要 提交到源码仓库。

Tip

推荐使用原生 libjpeg API

虽然 TurboJPEG API 设计更简洁,但在嵌入式平台上 原生 libjpeg API 更稳定可靠生产环境建议使用原生 libjpeg API (参考 decode_to_rgb565decode_to_rgb888_native 示例)。

功能特性

  • JPEG 解码: 支持 RGB888, RGB565, YUV420 输出

  • JPEG 编码: 支持 RGB888 输入

  • API 支持: 包含 TurboJPEG API 和 原生 libjpeg API 示例

注意事项

为了最佳兼容性和性能,建议 JPEG 图片满足以下条件:

  1. Baseline JPEG (非 Progressive)

  2. 移除元数据 (EXIF、XMP 等)

  3. 色度采样: 4:2:0 或 4:4:4

使用指南

本示例包含辅助脚本,用于优化 JPEG 图片;VenusA 编译时会自动将对应图片转换为 C 头文件。

  1. 准备图片: 使用 strip_metadata.py 清除元数据

    python3 tools/strip_metadata.py input.jpg output_clean.jpg
    
  2. 替换内置图片: ARCS 替换图片后需要更新 src/sample_jpeg.h;VenusA 只需要替换 picture/NASA-clean_800x480.jpg,CMake 会自动调用 bin2header.py 生成对应头文件。

  3. 编译运行:

    ARCS EVB:

    ./build.sh -C -S samples/media/jpeg_turbo/jpeg_turbo_show -DBOARD=arcs_evb
    ./tools/burn/cskburn -C arcs -s /dev/ttyACM0 -b 3000000 0x0 build/arcs.bin
    picocom -b 921600 /dev/ttyACM0
    

    VenusA:

    ./build.sh -C -S samples/media/jpeg_turbo/jpeg_turbo_show -DBOARD=venusa_rd_evb
    ./tools/burn/cskburn -C venusa -s /dev/ttyACM0 -b 3000000 0x0 build/arcs.bin
    picocom -b 921600 /dev/ttyACM0
    

关键函数说明

  • decode_to_rgb565(): 使用原生 API 解码为 RGB565。生产环境推荐,内存占用低,稳定性高。

  • decode_to_rgb888_native(): 使用原生 API 解码为 RGB888。生产环境推荐

  • decode_to_rgb888(): 使用 TurboJPEG API 解码为 RGB888。仅供参考。

  • decode_to_yuv420(): 使用 TurboJPEG API 解码为 YUV420。仅供参考。

  • encode_rgb_to_jpeg(): 使用 TurboJPEG API 将 RGB888 编码为 JPEG。

参考资料

工具脚本