用python生成 gif 动图的方法

工作中涉及到把一系列图片生成 fig,查询了一些方法,主要有两种,下面一一介绍
下图是我从原视频拆出来的图片
宽度: 544,
高度: 960,
视频帧率: 30
由于图片较多,我们只用了 1/4 的图片,要不生成的 gif 动图就太大了
在这里插入图片描述

一、用 imageio 库生成动态图片

没安装的可以 pip install imageio 安装一下

代码如下

import imageio
from pathlib import Path


def imgs2gif(imgPaths, saveName, duration=None, loop=0, fps=None):
    """
    生成动态图片 格式为 gif
    :param imgPaths: 一系列图片路径
    :param saveName: 保存gif的名字
    :param duration: gif每帧间隔, 单位 秒
    :param fps: 帧率
    :param loop: 播放次数(在不同的播放器上有所区别), 0代表循环播放
    :return:
    """
    if fps:
        duration = 1 / fps
    images = [imageio.imread(str(img_path)) for img_path in imgPaths]
    imageio.mimsave(saveName, images, "gif", duration=duration, loop=loop)


pathlist = Path(r"G:\img").glob("*.jpg")

p_lis = []
for n, p in enumerate(pathlist):
    if n % 5 == 0:
        p_lis.append(p)

imgs2gif(p_lis, "dance_0.gif", 0.033 * 5, 0)
imgs2gif(p_lis, "dance_1.gif", 0.033 * 5, 1)

下面分别是循环播放和只播放一次 gif 图片
在这里插入图片描述

在这里插入图片描述

二、用 PIL 库生成动态图片

代码如下:

from pathlib import Path
from PIL import Image


def imgs2gif(imgPaths, saveName, duration=None, loop=0, fps=None):
    """
    生成动态图片 格式为 gif
    :param imgPaths: 一系列图片路径
    :param saveName: 保存gif的名字
    :param duration: gif每帧间隔, 单位 秒
    :param fps: 帧率
    :param loop: 播放次数(在不同的播放器上有所区别), 0代表循环播放
    :return:
    """
    if fps:
        duration = 1 / fps
    duration *= 1000
    imgs = [Image.open(str(path)) for path in imgPaths]
    imgs[0].save(saveName, save_all=True, append_images=imgs, duration=duration, loop=loop)


pathlist = Path(r"G:\img").glob("*.jpg")

p_lis = []
for n, p in enumerate(pathlist):
    if n % 5 == 0:
        p_lis.append(p)

imgs2gif(p_lis, "dance_2.gif", 0.033 * 5, 1)

总结

使用 imageio 库生成的gif图片清晰度高,而且小
同样是上面的图片, 用 PIL 库生成动图 7.28M 而且动图上噪点较多
imageio 生成的动图清晰, 只有4.59M

说明: 以上图片来自网络上的视频,如有侵权,联系删除

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐