文章目录
一、简介
播放文件中的gif图片,播放TF卡中的gif图片
前置相关TF等博文拓展
例程参考:[AGif播放] (https://docs.sifli.com/projects/sdk/latest/sf32lb52x/example/multimedia/agif/lvgl/README.html) 、LVGL_v8_example
二、配置/代码
1.开启menuconfig配置


2.资源存放
存放位置再 assert/gif文件夹下
TF卡gif图存放在根目录 gif/xxx.gif

需要在SConscript中添加相关配置

c
# for module compiling
import os
from building import *
import rtconfig
cwd = GetCurrentDir()
list = os.listdir(cwd)
objs_ezip = []
objs_gif = []
objs_no_ezip = []
objs_large_ezip = []
objs_ezip += Glob('*ezip/*.png')
objs_gif += Glob('*gif/*.gif')
objs_no_ezip = Glob('no_ezip/*.png')
objs_large_ezip += Glob('large_ezip/*.png')
def align_to_power_of_two_and_str(num):
power = 1
while power < num:
power *= 2
return str(power)
#color_fmt, file_fmt, section_name
if 16 == GetConfigValue('LV_COLOR_DEPTH'):
img_flags = '-rgb565'
else:
img_flags = '-rgb888'
img_flags = img_flags + ' -section ROM3_IMG -lvgl_version 9 '
if GetDepend('EZIP_PAL_SUPPORT'):
if GetDepend('EZIP_PAL_SUPPORT_1'):
img_flags += ' -pal_support 1 '
else:
img_flags += ' -pal_support '
if GetDepend('LV_FB_LINE_NUM'):
ers_v = align_to_power_of_two_and_str(GetConfigValue('LV_FB_LINE_NUM'))
else:
ers_v = '128'
if GetDepend('BSP_USING_PC_SIMULATOR'):
objs = Env.ImgResource(objs_no_ezip + objs_ezip + objs_large_ezip + objs_gif, img_flags+' -cfile 1 -simu')
else:
objs = Env.ImgResource(objs_no_ezip, img_flags+' -cfile 1 -dpt 1')
objs += Env.ImgResource(objs_ezip, img_flags+' -cfile 2 -dpt 1')
objs += Env.ImgResource(objs_gif, img_flags+' -cfile 2 -dpt 1')
objs += Env.ImgResource(objs_large_ezip, img_flags+' -cfile 2 -dpt 4 -ers '+ers_v)
if GetOption('no_cc'):
objs = []
objs = DefineGroup('resource', objs, depend = ['PKG_USING_LITTLEVGL2RTT'])
Return ('objs')
3.代码
以下两段代码选择一段均可显示
文件夹中gif图播放代码
c
LV_IMG_DECLARE(muse);
lv_obj_t *gif;
lv_color_t bg_color;
/* gif控件创建 */
gif = lv_gif_dec_create(lv_scr_act(), LV_EXT_IMG_GET(muse), &bg_color, LV_COLOR_DEPTH);
lv_gif_dec_loop(gif, 1, 16);
lv_gif_dec_end_cb_register(gif, agif_loop_end_func);
TF卡中gif图播放代码
c
lv_obj_t *gif;
gif = lv_gif_create(lv_scr_act());
lv_gif_set_src(gif,"A:gif/xiaochou.gif");
LOG_I("set gif success");
lv_obj_center(gif);
完整代码
c
#include "rtthread.h"
#include "bf0_hal.h"
#include "drv_io.h"
#include "./LVGL/lvgl_v9.h"
#include "mem_section.h" //L2_RET_BSS_SECT
#define TF_JPG_THREAD_STACK_SIZE (8 * 1024)
static uint32_t tf_jpg_thread_stack[TF_JPG_THREAD_STACK_SIZE / sizeof(uint32_t)] L2_RET_BSS_SECT(tf_jpg_thread_stack);
static struct rt_thread tf_jpg_thread;
/**
* @brief Main program
* @param None
* @retval 0 if success, otherwise failure number
*/
int main(void)
{
rt_uint32_t ms;
lvgl_v9_init(); // Initialize LVGL
// lv_obj_t *gif;
// gif = lv_gif_create(lv_scr_act());
// lv_gif_set_src(gif,"A:gif/huaixiao.gif");
//LOG_I("set gif success");
// lv_obj_t * img = lv_img_create(lv_scr_act());
// lv_img_set_src(img, "A:/picture/TF_1.jpg");
// lv_obj_center(img);
// lv_obj_align(img, LV_ALIGN_CENTER, 0, 0);
rt_err_t tf_jpg_thread_result = rt_thread_init(&tf_jpg_thread,
"TF_JPG",
TF_JPG_display,
NULL,
&tf_jpg_thread_stack[0],
TF_JPG_THREAD_STACK_SIZE,
20,
10);
if (tf_jpg_thread_result == RT_EOK)
{
rt_thread_startup(&tf_jpg_thread); // 启动
}
else
{
rt_kprintf("Failed to init TF_JPG thread\n");
}
while (1)
{
ms = lv_task_handler();
rt_thread_mdelay(ms);
}
return RT_EOK;
}
#include "lvgl_v9.h"
#include <rtthread.h>
#include <rtdevice.h>
#include "littlevgl2rtt.h"
#include "lvgl.h"
#include "gui_app_fwk.h"
#include "gifdec.h"
//#include "app_mem.h"
#include "lv_ext_resource_manager.h"
#include "ulog.h"
#include "agif.h"
rt_err_t lvgl_v9_init(void)
{
rt_err_t ret = RT_EOK;
/* init littlevGL */
ret = littlevgl2rtt_init("lcd");
if (ret != RT_EOK)
{
return ret;
}
lv_ex_data_pool_init();
return RT_EOK;
}
TF_JPG_display_t jpg_display; // JPG显示结构体
static void agif_loop_end_func(void)
{
LOG_I("%s", __func__);
}
void TF_JPG_display(void *parameter)
{
//jpg_display.img_obj = lv_img_create(lv_scr_act());
LV_IMG_DECLARE(muse);
lv_obj_t *gif;
lv_color_t bg_color;
gif = lv_gif_dec_create(lv_scr_act(), LV_EXT_IMG_GET(muse), &bg_color, LV_COLOR_DEPTH);
lv_gif_dec_loop(gif, 1, 16);
lv_gif_dec_end_cb_register(gif, agif_loop_end_func);
// lv_obj_t *gif;
// gif = lv_gif_create(lv_scr_act());
// lv_gif_set_src(gif,"A:gif/xiaochou.gif");
// LOG_I("set gif success");
// lv_obj_center(gif);
// lv_obj_t *gif;
// gif = lv_gif_create(lv_scr_act());
// lv_gif_set_src(gif,"A:gif/huaixiao.gif");
while (1)
{
// for(int i = 5; i >= 1; i--) //有几张图片就改几
// {
// /* Assuming a File system is attached to letter 'A'
// * E.g. set LV_USE_FS_STDIO 'A' in lv_conf.h */
// rt_snprintf(jpg_display.file_path, sizeof(jpg_display.file_path),
// "A:/picture/TF_%d.jpg", /* 图片存放在根目录 /picture 文件夹下,命名方式为TF_x.jpg */
// i);
// lv_img_set_src(jpg_display.img_obj, jpg_display.file_path);
// const void * src = lv_img_get_src(jpg_display.img_obj);
// lv_img_decoder_get_info(src, &jpg_display.img_header);
// lv_coord_t width = jpg_display.img_header.w;
// lv_coord_t height = jpg_display.img_header.h;
// lv_obj_set_pos(jpg_display.img_obj, (LCD_WIDTH - width) / 2 , (LCD_HEIGHT - height) / 2); // 居中显示
rt_thread_mdelay(2000);
//}
}
}