概述
图像可以作为变量嵌入到应用程序中。除此之外,它们还可以从外部存储中加载。这允许更大的灵活性,例如在不重新构建应用程序的情况下更新图像。
从v0.28.0开始,已实现外部图像文件支持。
配置
启用外部图像支持
- 导航到
项目
→项目配置...
- 启用
使用外部图像文件
- 配置
路径前缀
- 在
lv_conf.h
中定义解码器支持:
#define LV_USE_FS_STDIO 1 // 启用文件系统支持
#define LV_USE_PNG 1 // 启用PNG解码器
#define LV_USE_JPEG 1 // 启用JPEG解码器
#define LV_USE_BMP 1 // 启用BMP解码器
文件系统驱动程序实现
实现并注册文件系统驱动程序用于文件I/O操作。
为模拟器提供了参考实现,可以针对自定义实现进行调整:
/* LVGL的文件系统回调 */
static void *fs_open(lv_fs_drv_t *drv, const char *path, lv_fs_mode_t mode) {
LV_UNUSED(drv);
const char *flags = (mode == LV_FS_MODE_WR) ? "wb" : "rb";
return fopen(path, flags);
}
static lv_fs_res_t fs_close(lv_fs_drv_t *drv, void *file) {
LV_UNUSED(drv);
fclose((FILE *)file);
return LV_FS_RES_OK;
}
static lv_fs_res_t fs_read(lv_fs_drv_t *drv, void *file, void *buf,
uint32_t btr, uint32_t *br) {
LV_UNUSED(drv);
*br = fread(buf, 1, btr, (FILE *)file);
return (*br > 0) ? LV_FS_RES_OK : LV_FS_RES_UNKNOWN;
}
static lv_fs_res_t fs_seek(lv_fs_drv_t *drv, void *file, uint32_t pos,
lv_fs_whence_t whence) {
LV_UNUSED(drv);
int origin = (whence == LV_FS_SEEK_SET) ? SEEK_SET
: (whence == LV_FS_SEEK_CUR) ? SEEK_CUR
: SEEK_END;
fseek((FILE *)file, pos, origin);
return LV_FS_RES_OK;
}
static lv_fs_res_t fs_tell(lv_fs_drv_t *drv, void *file, uint32_t *pos) {
LV_UNUSED(drv);
*pos = ftell((FILE *)file);
return LV_FS_RES_OK;
}
/* 注册文件系统 */
void register_fs() {
static lv_fs_drv_t fs_drv;
lv_fs_drv_init(&fs_drv);
fs_drv.letter = 'S'; // 驱动器字母
fs_drv.open_cb = fs_open;
fs_drv.close_cb = fs_close;
fs_drv.read_cb = fs_read;
fs_drv.seek_cb = fs_seek;
fs_drv.tell_cb = fs_tell;
lv_fs_drv_register(&fs_drv);
}
通过在main()
中调用register_fs()
来注册文件系统:
int main() {
...
register_fs();
...
}
通过在simulator
文件夹中的lv_conf.h
中定义USE_SIMULATOR
来启用模拟:
#define USE_SIMULATOR
重要注意事项
相关信息
如果由于内存分配问题导致图像加载失败,请增加lv_conf.h
中的LV_MEM_SIZE
:
# define LV_MEM_SIZE (? * 1024U * 1024U) /*[bytes]*/
注意
- 所有图像必须位于目标设备上配置的
路径前缀
目录中 - 图像组件尺寸必须与源图像尺寸匹配,因为原始图像将不进行缩放显示