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

如何在Python流水线中使用imageio为GIF添加文本且不存储中间帧

实现方案

全程不需要生成任何中间图片文件,所有帧处理操作都在内存中完成:直接将h5读取到的numpy格式帧数据转为PIL图像对象绘制文本标注,绘制完成后转回numpy数组传给imageio输出GIF即可。
由于Pillow是imageio的核心依赖,安装imageio时已经默认安装,不会额外引入冗余依赖。

修改后的完整代码

import h5py
import imageio
import numpy as np
from PIL import Image, ImageDraw, ImageFont

def make_gif(self, datafile, save_file, frame_limit:int=20, fps:int=10, verbose=True, meta_text:str=""):
    h5 = h5py.File(datafile, "r")
    raw_frames = h5['frames'][::2][:frame_limit]
    processed_frames = []

    # 加载字体,需要显示中文时替换为本地中文字体路径即可,比如SimHei.ttf、PingFang.ttc
    try:
        font = ImageFont.truetype("arial.ttf", 16)
    except:
        font = ImageFont.load_default(size=16)

    for frame_idx, frame in enumerate(raw_frames):
        # numpy数组转PIL图像,纯内存操作无磁盘写入
        img = Image.fromarray(frame)
        draw = ImageDraw.Draw(img)

        # 自定义拼接需要展示的元数据,可按需添加时间戳、实验参数、传感器数值等
        show_text = f"Frame {frame_idx+1}/{frame_limit} | {fps}fps"
        if meta_text:
            show_text = f"{meta_text} | {show_text}"

        # 计算文本尺寸,绘制半透明黑底提升文字在不同背景下的可读性
        text_bbox = draw.textbbox((0, 0), show_text, font=font)
        text_w, text_h = text_bbox[2] - text_bbox[0], text_bbox[3] - text_bbox[1]
        text_margin = 5
        text_pos = (10, 10) # 文本固定在左上角,可自行修改坐标调整位置
        draw.rectangle(
            (
                text_pos[0] - text_margin,
                text_pos[1] - text_margin,
                text_pos[0] + text_w + text_margin,
                text_pos[1] + text_h + text_margin
            ),
            fill=(0, 0, 0, 180)
        )
        # 绘制白色文本
        draw.text(text_pos, show_text, font=font, fill=(255, 255, 255))

        # 处理完成的帧转回numpy数组存入列表
        processed_frames.append(np.array(img))

    imageio.mimwrite(save_file, processed_frames, fps=fps)
    if verbose:
        print(f"Saved gif version: fps={fps}, nframes={frame_limit}", flush=True)

可调参数说明

  • 文本位置:修改text_pos的横纵坐标即可把文本放到任意位置,比如放到右上角就改成(img.width - text_w - 10, 10)
  • 样式调整:可自行修改字号、字体、文本颜色、背景透明度,适配不同分辨率的视频帧
  • 动态标注:如果需要每帧展示不同的数值(比如对应帧的时间戳、测量值),直接在循环内按帧索引取对应元数据,拼接到show_text中即可

内容的提问来源于stack exchange,提问作者Knova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:36:18