使用python生成 gif 格式的动图

用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

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

### 使用Python将视频文件转换为GIF 要将视频文件转换为GIF,可以使用多种方法和库来完成此操作。以下是几种常见的实现方式及其对应的代码示例。 #### 方法一:基于 `moviepy` 库 `moviepy` 是一个强大的多媒体处理库,支持音频、视频剪辑以及 GIF生成等功能。以下是一个完整的代码示例: ```python from moviepy.editor import * # 加载视频文件 video = VideoFileClip("input_video.mp4") # 调整视频尺寸(可选) video = video.resize(0.2) # 将视频保存为GIF格式 video.write_gif("output.gif", fps=15, program='ffmpeg') ``` 上述代码加载了一个名为 `input_video.mp4` 的视频文件,并将其调整到原始大小的 20%,最后以每秒 15 帧的速度导出为 GIF 文件[^1]。 --- #### 方法二:基于 `imageio` 和 OpenCV (`cv2`) 如果需要更灵活地控制每一帧的内容或者优化性能,可以选择结合 `imageio` 和 OpenCV 来实现。这种方法允许自定义帧率、分辨率以及其他参数。 ```python import cv2 import imageio def convert_to_gif(video_name="input_video.mp4", out_name="output.gif", scale=0.25, skip_rate=30, gif_fps=10): # 打开视频文件 cap = cv2.VideoCapture(video_name) frames = [] count = 0 while True: ret, frame = cap.read() if not ret: break # 控制采样频率 if count % skip_rate != 0: count += 1 continue # 缩放帧 resized_frame = cv2.resize(frame, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) # BGR转RGB rgb_frame = cv2.cvtColor(resized_frame, cv2.COLOR_BGR2RGB) # 添加到帧列表 frames.append(rgb_frame) count += 1 # 关闭视频流 cap.release() # 导出GIF with imageio.get_writer(out_name, mode='I', fps=gif_fps) as writer: for frame in frames: writer.append_data(frame) convert_to_gif() ``` 这段代码实现了从指定路径读取视频文件的功能,同时可以通过调节 `scale`, `skip_rate`, 和 `gif_fps` 参数来自定义输出效果[^5]。 --- #### 方法三:简化版——仅依赖于 `imageio` 对于需要复杂编辑的情况,可以直接利用 `imageio` 提供的基础接口快速完成任务。 ```python import imageio reader = imageio.get_reader('input.mp4') frames = [] for i, frame in enumerate(reader): frames.append(frame) with imageio.get_writer('output.gif', mode='I') as writer: for frame in frames: writer.append_data(frame) ``` 该方案适合初学者尝试简单的视频到 GIF 转换过程[^2]。 --- ### 总结 以上三种方法分别适用于同需求层次的应用场景: - 如果追求简洁高效,则推荐 **method one**; - 需求精细调参时考虑采用 **method two** 或者其他高级技术栈组合; - 对新手友好且易于理解的是 **method three**。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

viziviuz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值