如何在Dearpygui中显示GIF?基于现有工具实现动图渲染
在Dearpygui中实现GIF渲染与动画播放
Dearpygui本身不支持直接加载GIF,但可以通过拆分GIF帧+定时器切换纹理的方式实现动画播放,核心依赖Pillow库处理GIF帧,步骤如下:
1. 准备依赖
安装Pillow库用于解析GIF:
pip install pillow
2. 核心实现思路
- 用Pillow读取GIF文件,提取每一帧的像素数据
- 将每一帧转换为Dearpygui支持的纹理格式
- 通过定时器周期性切换显示的纹理,模拟GIF动画
3. 完整代码示例
import dearpygui.dearpygui as dpg from PIL import Image import numpy as np def load_gif_frames(gif_path, target_size=None): """加载GIF并提取所有帧,可选缩放尺寸""" frames = [] with Image.open(gif_path) as img: frame_duration = img.info.get("duration", 100) # 获取原GIF帧间隔,默认100ms for frame_num in range(img.n_frames): img.seek(frame_num) # 转换为RGBA格式(适配Dearpygui纹理要求) frame_rgba = img.convert("RGBA") # 按需缩放帧尺寸 if target_size: frame_rgba = frame_rgba.resize(target_size, Image.Resampling.LANCZOS) # 转换为numpy数组(Dearpygui纹理需要的格式) frame_data = np.array(frame_rgba, dtype=np.float32) / 255.0 # 归一化到0-1范围 frames.append(frame_data) return frames, frame_duration def update_gif_frame(): """定时器回调:切换到下一帧""" global current_frame current_frame = (current_frame + 1) % len(gif_frames) dpg.set_value("gif_texture", gif_frames[current_frame]) if __name__ == "__main__": dpg.create_context() dpg.create_viewport(title="GIF播放器", width=600, height=600) # 加载GIF帧(替换为你的GIF路径,可选设置目标尺寸) gif_frames, frame_duration = load_gif_frames("example.gif", target_size=(500, 500)) current_frame = 0 # 注册纹理 with dpg.texture_registry(): dpg.add_raw_texture( width=gif_frames[0].shape[1], height=gif_frames[0].shape[0], default_value=gif_frames[0], format=dpg.mvFormat_Float_rgba, tag="gif_texture" ) # 创建显示窗口 with dpg.window(label="GIF预览", width=600, height=600): dpg.add_image("gif_texture") # 设置循环定时器,每隔frame_duration毫秒更新一次帧 dpg.set_timer(frame_duration, callback=update_gif_frame, repeat=True) dpg.setup_dearpygui() dpg.show_viewport() dpg.start_dearpygui() dpg.destroy_context()
4. 关键细节说明
- 纹理格式匹配:将PIL的RGBA帧转换为
np.float32并归一化到0-1范围,对应Dearpygui的mvFormat_Float_rgba格式,确保渲染正常 - 帧间隔同步:从GIF的
info中读取原帧间隔,保证动画速度与原GIF一致 - 性能优化:如果GIF尺寸过大,建议通过
target_size参数缩放帧,避免内存占用过高或渲染卡顿 - 循环播放:通过取模运算
current_frame = (current_frame + 1) % len(gif_frames)实现无限循环
内容的提问来源于stack exchange,提问作者grybouilli
相关产品推荐
相关产品推荐

