Page 1 of 2
如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 15:02
by 15318855264
在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不了
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 15:57
by liujt@tuya.com
请问一下现在是哪个应用?gif文件是如何烧录到flash中的?
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 16:00
by liujt@tuya.com
直接通过lvgl读文件渲染gif,效果并不是很理想,建议先搜索"TUYA_GUI_GIF_TEST"这个定义,我们的开发包中有使用播放gif的例程。
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 16:20
by 15318855264
T5_TuyaOS-3.12.11 tuyaos_demo_ai_toy 挂载的是SD_Flash在电脑上格式化 之后导入GIF文件
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 16:21
by 15318855264
liujt@tuya.com 2025年 Jul 2日 16:00
直接通过lvgl读文件渲染gif,效果并不是很理想,建议先搜索"TUYA_GUI_GIF_TEST"这个定义,我们的开发包中有使用播放gif的例程。
TUYA_GUI_GIF_TEST请问这例子在哪
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 16:36
by liujt@tuya.com
参考以下应用:
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)
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 20:04
by 15318855264
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就不行了 开发板会一直重启
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 2日 20:09
by 15318855264
15318855264 2025年 Jul 2日 20:04
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就不行了 开发板会一直重启
现在发现用60kb的也不行 还有其他办法吗
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 3日 09:02
by liujt@tuya.com
开发包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
Re: 如何打开Flash里面的GIF文件
Posted: 2025年 Jul 3日 10:03
by 15318855264
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);这样子实现不可以吗