如何打开Flash里面的GIF文件

Wi-Fi 设备、Wi-Fi 低功耗设备、Wi-Fi BLE 双模设备、Ethernet设备、Ethernet+Wi-Fi设备等
15318855264
Posts: 24

在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不了

liujt@tuya.com
Posts: 58

Re: 如何打开Flash里面的GIF文件

请问一下现在是哪个应用?gif文件是如何烧录到flash中的?

liujt@tuya.com
Posts: 58

Re: 如何打开Flash里面的GIF文件

直接通过lvgl读文件渲染gif,效果并不是很理想,建议先搜索"TUYA_GUI_GIF_TEST"这个定义,我们的开发包中有使用播放gif的例程。

15318855264
Posts: 24

Re: 如何打开Flash里面的GIF文件

liujt@tuya.com 2025年 Jul 2日 15:57

请问一下现在是哪个应用?gif文件是如何烧录到flash中的?

T5_TuyaOS-3.12.11 tuyaos_demo_ai_toy 挂载的是SD_Flash在电脑上格式化 之后导入GIF文件

15318855264
Posts: 24

Re: 如何打开Flash里面的GIF文件

liujt@tuya.com 2025年 Jul 2日 16:00

直接通过lvgl读文件渲染gif,效果并不是很理想,建议先搜索"TUYA_GUI_GIF_TEST"这个定义,我们的开发包中有使用播放gif的例程。

TUYA_GUI_GIF_TEST请问这例子在哪

liujt@tuya.com
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)

15318855264
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就不行了 开发板会一直重启

15318855264
Posts: 24

Re: 如何打开Flash里面的GIF文件

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的也不行 还有其他办法吗

liujt@tuya.com
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

15318855264
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);这样子实现不可以吗

Post Reply