JPG 解码器

允许在 LVGL 中使用 JPG 图像。此外,它还允许使用一种称为 Split JPG (SJPG) 的自定义格式,该格式可以在嵌入式系统上以更优化的方式解码。

概述

  • 支持普通 JPG 和自定义 SJPG 格式。

  • 解码普通 JPG 会消耗与整个未压缩图像大小相同的 RAM(仅推荐用于具有更多 RAM 的设备)。

  • SJPG 是一种基于“普通” JPG 的自定义格式,专为 LVGL 设计。

  • SJPG 是“分割 JPEG”,它是带有 sjpg 头的小型 JPEG 片段的集合。

  • SJPG 的大小几乎与 JPG 文件相当,或者可能稍大一些。

  • 实现了从文件和 C 数组中读取文件。

  • SJPG 帧片段缓存支持在缓存可用时快速获取行数据。

  • 默认情况下,SJPG 图像缓存大小为图像宽度 * 2 * 16 字节(可以修改)。

  • 当前仅支持 16 位图像格式(TODO)。

  • 仅解码 JPG 和 SJPG 图像的必要部分,因此它们无法缩放或旋转。

用法

如果在 lv_conf.h 中通过 LV_USE_SJPG 启用,LVGL 将自动注册一个新的图像解码器,因此 JPG 和 SJPG 文件可以直接用作图像源。例如:

lv_img_set_src(my_img, "S:path/to/picture.jpg");

请注意,需要注册一个文件系统驱动程序才能从文件中打开图像。可以在此处了解更多信息,或者只需在 lv_conf.h 中通过 LV_USE_FS_... 启用一个文件系统驱动程序。

转换器

将 JPG 转换为 C 数组

  • 使用 LVGL 在线工具 https://lvgl.io/tools/imageconverter

  • 颜色格式 = RAW,输出格式 = C 数组

将 JPG 转换为 SJPG

需要 python3 和 PIL 库。(可以通过 pip3 install pillow 安装 PIL)

将 JPG 转换为 SJPG 的步骤:

  • 将要转换的图像复制到 lvgl/scripts 目录。

  • 进入目录:cd lvgl/scripts

  • 执行命令:python3 jpg_to_sjpg.py image_to_convert.jpg。它会生成一个 C 文件和一个 SJPG 图像。

预期结果如下:

转换开始...

输入:
        image_to_convert.jpg
        分辨率 = 640 x 480

输出:
        用时 = 1.66 秒
        二进制大小 = 77.1 KB
        walpaper.sjpg           (二进制文件)
        walpaper.c              (C 数组)

一切正常!

示例

加载 SJPG 图像

C code  

 GitHub
#include "../../lv_examples.h"
#if LV_USE_SJPG && LV_BUILD_EXAMPLES

/**
 * Load an SJPG image
 */
void lv_example_sjpg_1(void)
{
    lv_obj_t * wp;

    wp = lv_img_create(lv_scr_act());
    /* Assuming a File system is attached to letter 'A'
     * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */
    lv_img_set_src(wp, "A:lvgl/examples/libs/sjpg/small_image.sjpg");
}

#endif

MicroPython code  

 GitHub Simulator
#!/opt/bin/lv_micropython -i
import lvgl as lv
import display_driver
import fs_driver

fs_drv = lv.fs_drv_t()
fs_driver.fs_register(fs_drv, 'S')

wp = lv.img(lv.scr_act())
# The File system is attached to letter 'S'

wp.set_src("S:small_image.sjpg")
wp.center()

API

Functions

void lv_split_jpeg_init(void)