如何在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
相关产品推荐
相关产品推荐

