Python用图片生成gif

本文介绍如何利用Python的PIL库,通过几行代码实现从一组相同大小的图片中创建动态GIF,适合初学者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找一组相同大小的图片,几行代码生成gif

import os
from PIL import Image

imgFolderPath = "C:\\Users\\xxx\\Downloads\\imgs"
fileList = os.listdir(imgFolderPath)
# 取第一张图片作为封面
firstImgPath = os.path.join(imgFolderPath, fileList[0])
im = Image.open(firstImgPath)
images = []
for img in fileList[1:]:
    imgPath = os.path.join(imgFolderPath, img)
    images.append(Image.open(imgPath))
# loop为是否循环,duration为gif的每张图片的播放时间
im.save('C:\\Users\\xxx\\Downloads\\imgs\\beauty.gif', save_all=True, append_images=images, loop=0, duration=500)

### Python生成GIF图片的方法和库 #### 使用PIL和images2gif库 可以利用`PIL`(Python Imaging Library)以及`images2gif`库来创建GIF文件。不过需要注意的是,在较新的版本中,推荐使用`Pillow`作为`PIL`的一个分支来进行像处理操作[^1]。 ```python from PIL import Image, ImageSequence import glob frames = [] imgs = sorted(glob.glob('path_to_images/*.png')) for i in imgs: new_frame = Image.open(i) frames.append(new_frame) # Save into a GIF file that loops forever frames[0].save('output.gif', format='GIF', append_images=frames[1:], save_all=True, duration=300, loop=0) ``` 此代码片段展示了如何读取一系列PNG格式的静态图片并将其组合成一个循环播放的GIF画文件。 #### 使用imageio库 另一个常用的选择是`imageio`库,它提供了简单易用的功能来加载、保存各种类型的多媒体数据,包括GIF格式。对于从图片序列生成GIF而言,只需指定输入图片路径列表即可完成任务;而对于视频转GIF,则可以通过先提取帧再合成的方式实现[^2]。 ##### 图片生成GIF ```python import imageio.v2 as imageio images = [] filenames = ['frame_{}.jpg'.format(i) for i in range(10)] # 假设有10张连续编号的照片 for filename in filenames: images.append(imageio.imread(filename)) imageio.mimsave('movie.gif', images, duration=.5) ``` 这段脚本会按照给定顺序依次读入多张JPEG格式的图片,并最终导出为名为'movie.gif'的象文件。 ##### 视频生成GIF 为了将一段视频转化为GIF,通常的做法是从源视频里抽取特定时间段内的每一帧画面形成一组静止像,之后依照上述方法把这些单独的画面拼接起来构成完整的画效果。 ```python import cv2 import numpy as np import imageio.v2 as imageio def extract_frames(video_path, start_time=None, end_time=None): cap = cv2.VideoCapture(video_path) fps = int(cap.get(cv2.CAP_PROP_FPS)) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) if not (start_time is None or end_time is None): frame_start = max(int(start_time * fps), 0) frame_end = min(int(end_time * fps), int(cap.get(cv2.CAP_PROP_FRAME_COUNT))) else: frame_start = 0 frame_end = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) frames = [] count = 0 while True and count < frame_end: ret, frame = cap.read() if not ret or count >= frame_end: break if count >= frame_start: rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frames.append(rgb_frame) count += 1 cap.release() return frames video_file = 'input_video.mp4' frames = extract_frames(video_file, start_time=5, end_time=8) # 提取第5秒到第8秒之间的所有帧 imageio.mimsave('output_from_video.gif', frames, duration=(end_time-start_time)/len(frames)) ``` 这里定义了一个辅助函数`extract_frames()`用来截取所需时间范围内的视频帧数,并通过调用`mimsave()`函数把它们合成为一个GIF文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

闲欢

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

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

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

打赏作者

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

抵扣说明:

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

余额充值