在3.1.12版本 我挂载一个SD_Flash 打开对应的宏 LV_USE_FS_FATFS 以及配置如下
#define LV_USE_FS_FATFS 1 //fanzj
// Modified by TUYA End
#if LV_USE_FS_FATFS
#define LV_FS_FATFS_LETTER 'S' /Set an upper cased letter on which the drive will accessible (e.g. 'A')/
#define LV_FS_FATFS_CACHE_SIZE 0 />0 to cache this number of bytes in lv_fs_read()/
#define LV_FS_FATFS_DISK_NUM 1 /* 0: RAM, 1: SDIO_SD, 2: UDISK, 3: FLASH. /
#endif
然后在通过
const char path = "S:/folder/image.bin";
lv_gif_set_src(gif_full,path); 去读取对应的GIF文件发现open不了
如何打开Flash里面的GIF文件
-
- Posts: 24
如何打开Flash里面的GIF文件
-
- Posts: 58
Re: 如何打开Flash里面的GIF文件
请问一下现在是哪个应用?gif文件是如何烧录到flash中的?
-
- Posts: 58
Re: 如何打开Flash里面的GIF文件
直接通过lvgl读文件渲染gif,效果并不是很理想,建议先搜索"TUYA_GUI_GIF_TEST"这个定义,我们的开发包中有使用播放gif的例程。
-
- Posts: 24
Re: 如何打开Flash里面的GIF文件
T5_TuyaOS-3.12.11 tuyaos_demo_ai_toy 挂载的是SD_Flash在电脑上格式化 之后导入GIF文件
-
- Posts: 24
Re: 如何打开Flash里面的GIF文件
liujt@tuya.com 2025年 Jul 2日 16:00直接通过lvgl读文件渲染gif,效果并不是很理想,建议先搜索"TUYA_GUI_GIF_TEST"这个定义,我们的开发包中有使用播放gif的例程。
TUYA_GUI_GIF_TEST请问这例子在哪
-
- Posts: 58
Re: 如何打开Flash里面的GIF文件
参考以下应用:
Code: Select all
static lv_img_dsc_t ui_img_gif = {0};
STATIC OPERATE_RET gif_img_load(char *filename, lv_img_dsc_t *img_dst)
{
OPERATE_RET ret = OPRT_COM_ERROR;
lv_fs_file_t file;
lv_fs_res_t res;
res = lv_fs_open(&file, filename, LV_FS_MODE_RD);
if (res != LV_FS_RES_OK) {
LV_LOG_ERROR("Failed to open file: %s\n", filename);
return ret;
}
// 读取文件大小
lv_fs_seek(&file, 0, LV_FS_SEEK_END); // 移动到文件末尾
uint32_t file_size;
lv_fs_tell(&file, &file_size); // 获取文件大小
lv_fs_seek(&file, 0, LV_FS_SEEK_SET); // 移动回文件开头
// 分配内存以存储文件内容
uint8_t *buffer = tkl_system_psram_malloc(file_size);
if (buffer == NULL) {
LV_LOG_ERROR("Memory allocation failed\n");
lv_fs_close(&file);
return ret;
}
uint32_t bytes_read;
res = lv_fs_read(&file, buffer, file_size, &bytes_read);
if (res != LV_FS_RES_OK || bytes_read != file_size) {
LV_LOG_ERROR("Failed to read file: %s\n", filename);
tkl_system_psram_free(buffer); // 释放内存
}
else {
LV_LOG_WARN("------------------------gif file '%s' load successful !\r\n", filename);
img_dst->data = buffer;
img_dst->data_size = file_size;
ret = OPRT_OK;
}
lv_fs_close(&file);
return ret;
}
void test_gif()
{
memset(&ui_img_gif, 0 ,sizeof(lv_img_dsc_t));
ui_img_gif.data = NULL;
if (gif_img_load("/sd/3.gif"), &ui_img_gif) == 0) {
lv_obj_t * gif_obj = lv_gif_create(switch_screen);
#if defined(TUYA_GUI_KV_TEST) || defined(TUYA_GUI_FS_KV_TEST)
//lv_obj_set_pos(gif_obj, 220, 600);
#else
//lv_obj_set_pos(gif_obj, 220, 460);
#endif
lv_obj_align_to(gif_obj, switch_screen, LV_ALIGN_TOP_LEFT, 10, 30); //放置屏幕左上角
lv_gif_set_src(gif_obj, (const void *)&ui_img_gif);
lv_gif_restart(gif_obj);
}
}
注意(sd中存储的是文件,而不是bin):
使用sd卡前,在应用中需要挂载sd,一般挂载在"/",调用 tkl_fs_mount("/", DEV_SDCARD),
gif_img_load中的文件一定是带路径的,和你将sd卡挂载的根目录及保存在sd卡中的目录名有关,
如3.gif存储在sd卡的folder目录下,则使用gif_img_load("/folder/3.gif"), &ui_img_gif)
-
- Posts: 24
Re: 如何打开Flash里面的GIF文件
liujt@tuya.com 2025年 Jul 2日 16:36参考以下应用:
Code: Select all
static lv_img_dsc_t ui_img_gif = {0}; STATIC OPERATE_RET gif_img_load(char *filename, lv_img_dsc_t *img_dst) { OPERATE_RET ret = OPRT_COM_ERROR; lv_fs_file_t file; lv_fs_res_t res; res = lv_fs_open(&file, filename, LV_FS_MODE_RD); if (res != LV_FS_RES_OK) { LV_LOG_ERROR("Failed to open file: %s\n", filename); return ret; } // 读取文件大小 lv_fs_seek(&file, 0, LV_FS_SEEK_END); // 移动到文件末尾 uint32_t file_size; lv_fs_tell(&file, &file_size); // 获取文件大小 lv_fs_seek(&file, 0, LV_FS_SEEK_SET); // 移动回文件开头 // 分配内存以存储文件内容 uint8_t *buffer = tkl_system_psram_malloc(file_size); if (buffer == NULL) { LV_LOG_ERROR("Memory allocation failed\n"); lv_fs_close(&file); return ret; } uint32_t bytes_read; res = lv_fs_read(&file, buffer, file_size, &bytes_read); if (res != LV_FS_RES_OK || bytes_read != file_size) { LV_LOG_ERROR("Failed to read file: %s\n", filename); tkl_system_psram_free(buffer); // 释放内存 } else { LV_LOG_WARN("------------------------gif file '%s' load successful !\r\n", filename); img_dst->data = buffer; img_dst->data_size = file_size; ret = OPRT_OK; } lv_fs_close(&file); return ret; } void test_gif() { memset(&ui_img_gif, 0 ,sizeof(lv_img_dsc_t)); ui_img_gif.data = NULL; if (gif_img_load("/sd/3.gif"), &ui_img_gif) == 0) { lv_obj_t * gif_obj = lv_gif_create(switch_screen); #if defined(TUYA_GUI_KV_TEST) || defined(TUYA_GUI_FS_KV_TEST) //lv_obj_set_pos(gif_obj, 220, 600); #else //lv_obj_set_pos(gif_obj, 220, 460); #endif lv_obj_align_to(gif_obj, switch_screen, LV_ALIGN_TOP_LEFT, 10, 30); //放置屏幕左上角 lv_gif_set_src(gif_obj, (const void *)&ui_img_gif); lv_gif_restart(gif_obj); } }
注意(sd中存储的是文件,而不是bin):
使用sd卡前,在应用中需要挂载sd,一般挂载在"/",调用 tkl_fs_mount("/", DEV_SDCARD),
gif_img_load中的文件一定是带路径的,和你将sd卡挂载的根目录及保存在sd卡中的目录名有关,
如3.gif存储在sd卡的folder目录下,则使用gif_img_load("/folder/3.gif"), &ui_img_gif)
我发现这个GIF文件超过100kb就不行了 开发板会一直重启
-
- Posts: 24
Re: 如何打开Flash里面的GIF文件
15318855264 2025年 Jul 2日 20:04liujt@tuya.com 2025年 Jul 2日 16:36参考以下应用:
Code: Select all
static lv_img_dsc_t ui_img_gif = {0}; STATIC OPERATE_RET gif_img_load(char *filename, lv_img_dsc_t *img_dst) { OPERATE_RET ret = OPRT_COM_ERROR; lv_fs_file_t file; lv_fs_res_t res; res = lv_fs_open(&file, filename, LV_FS_MODE_RD); if (res != LV_FS_RES_OK) { LV_LOG_ERROR("Failed to open file: %s\n", filename); return ret; } // 读取文件大小 lv_fs_seek(&file, 0, LV_FS_SEEK_END); // 移动到文件末尾 uint32_t file_size; lv_fs_tell(&file, &file_size); // 获取文件大小 lv_fs_seek(&file, 0, LV_FS_SEEK_SET); // 移动回文件开头 // 分配内存以存储文件内容 uint8_t *buffer = tkl_system_psram_malloc(file_size); if (buffer == NULL) { LV_LOG_ERROR("Memory allocation failed\n"); lv_fs_close(&file); return ret; } uint32_t bytes_read; res = lv_fs_read(&file, buffer, file_size, &bytes_read); if (res != LV_FS_RES_OK || bytes_read != file_size) { LV_LOG_ERROR("Failed to read file: %s\n", filename); tkl_system_psram_free(buffer); // 释放内存 } else { LV_LOG_WARN("------------------------gif file '%s' load successful !\r\n", filename); img_dst->data = buffer; img_dst->data_size = file_size; ret = OPRT_OK; } lv_fs_close(&file); return ret; } void test_gif() { memset(&ui_img_gif, 0 ,sizeof(lv_img_dsc_t)); ui_img_gif.data = NULL; if (gif_img_load("/sd/3.gif"), &ui_img_gif) == 0) { lv_obj_t * gif_obj = lv_gif_create(switch_screen); #if defined(TUYA_GUI_KV_TEST) || defined(TUYA_GUI_FS_KV_TEST) //lv_obj_set_pos(gif_obj, 220, 600); #else //lv_obj_set_pos(gif_obj, 220, 460); #endif lv_obj_align_to(gif_obj, switch_screen, LV_ALIGN_TOP_LEFT, 10, 30); //放置屏幕左上角 lv_gif_set_src(gif_obj, (const void *)&ui_img_gif); lv_gif_restart(gif_obj); } }
注意(sd中存储的是文件,而不是bin):
使用sd卡前,在应用中需要挂载sd,一般挂载在"/",调用 tkl_fs_mount("/", DEV_SDCARD),
gif_img_load中的文件一定是带路径的,和你将sd卡挂载的根目录及保存在sd卡中的目录名有关,
如3.gif存储在sd卡的folder目录下,则使用gif_img_load("/folder/3.gif"), &ui_img_gif)我发现这个GIF文件超过100kb就不行了 开发板会一直重启
现在发现用60kb的也不行 还有其他办法吗
-
- Posts: 58
Re: 如何打开Flash里面的GIF文件
开发包0.0.20下有个应用目录tuyaos_iot_t5_gui_demo_product_class-T5_gui_demo_quickstart\src\gui\tuya_basic_demo,lv_example_switch_1.c,参考宏定义“TUYA_GUI_GIF_TEST”的地方就是播放gif例程,可以先跑跑这个demo
-
- Posts: 24
Re: 如何打开Flash里面的GIF文件
liujt@tuya.com 2025年 Jul 3日 09:02开发包0.0.20下有个应用目录tuyaos_iot_t5_gui_demo_product_class-T5_gui_demo_quickstart\src\gui\tuya_basic_demo,lv_example_switch_1.c,参考宏定义“TUYA_GUI_GIF_TEST”的地方就是播放gif例程,可以先跑跑这个demo
12的版本不能像我这种#define LV_USE_FS_FATFS 1 //fanzj
// Modified by TUYA End
#if LV_USE_FS_FATFS
#define LV_FS_FATFS_LETTER 'S' /Set an upper cased letter on which the drive will accessible (e.g. 'A')/
#define LV_FS_FATFS_CACHE_SIZE 0 />0 to cache this number of bytes in lv_fs_read()/
#define LV_FS_FATFS_DISK_NUM 1 /* 0: RAM, 1: SDIO_SD, 2: UDISK, 3: FLASH. /
#endif
然后在通过
const char path = "S:/folder/image.bin";
lv_gif_set_src(gif_full,path);这样子实现不可以吗