You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:12