Hi~大家好!
今天教大家用python对GIF动图进行拆分、合成、倒放~
导入相关库:
import os
import imageio
from PIL import Image, ImageSequence
os库是用来操作文件夹的,imageio库是用来合成GIF,PIL库大家应该都很熟悉,这次用到它的Image和 ImageSequence模块,用来实现GIF的读取和拆分。
所有库可以直接用pip命令进行安装:
pip install 库名
准备一张GIF动图,本文只要此动图的基础之上进行操作:

合成或者倒放GIF动图也可以使用其它若干张图片进行操作。
拆分相比合并和倒放容易很多,这里介绍两种方法。先用os在目录下创建一个名为拆分的文件夹:
if not os.path.exists('拆分'):
os.makedirs('拆分')
第一种方法是使用Image模块下的seek函数,可以直接拆分;拆分后建议按顺序命名图片:
img = Image.open('噢特曼.gif') # 打开GIF动图
try:
i = 1
while True:
img.seek(i) # 拆分
img.save(f'拆分/{i}.png') # 保存
i += 1
except:
pass
第二种方法相比第一种简洁很多,用的是ImageSequence模块中的Iterator函数:
img = Image.open('噢特曼.gif')
i = 0
for f in ImageSequence.Iterator(img): # 循环遍历GIF中的帧
i += 1
f.save(f'拆分/{i}.png') # 保存
从Iterator函数的源码可以看出,它其实是在seek函数基础之上进行封装的:

两个方法得出的结果都一样,动图的每一帧都保存下来了:

imageio是个第三方库,它可以直接读取很多格式的图片和视频,然后可以将图片和视频转换成其它格式。本文用到的是imageio库的imread和mimsave函数,一个读取,一个保存:
img_list = []
imagelist = os.listdir('拆分') # 打开文件夹
imagelist.sort(key=lambda x: int(x.split('.')[0])) # 按照图片中的数字进行升序排序
for i in range(len(imagelist)): # 计算图片总数进行遍历
img_list.append(imageio.imread('拆分/' + imagelist[i])) # 读取图片
imageio.mimsave('合并噢特曼.gif', img_list, 'GIF', duration=0.05) # 保存 duration 每一帧的速度
还可以把一些自己心仪的图片配上文字合成动图:

倒放其实是把动图拆分后,利用方法对拆分的帧进行倒序排序,再进行合成保存,这里介绍两种方法。
第一种只要依然是使用imageio 进行合成GIF动图,但更改了排序方式,把它改为降序排序,在代码中添加reverse=True :
img_list = []
imagelist = os.listdir('拆分')
imagelist.sort(key=lambda x: int(x.split('.')[0]), reverse=True) # reverse=True时,排序方法改为降序排序
for i in range(len(imagelist)):
img_list.append(imageio.imread('拆分/' + imagelist[i]))
imageio.mimsave('倒放.gif', img_list, 'GIF', duration=0.05)
效果预览:

第二种用到python内置函数reverse()进行帧的倒序排序,但效果不是很好,动图放着放着就会卡住,而且不能设置动图的每一帧的速度。
im = Image.open('噢特曼.gif')
sequence = []
for f in ImageSequence.Iterator(im):
sequence.append(f.copy())
sequence.reverse() # 将列表中的帧通过reverse()函数进行倒序
sequence[0].save('倒放噢特曼.gif', save_all=True, append_images=sequence[1:]) # 保存
效果预览:

以上便是今天的全部内容了,如果你喜欢今天的内容,希望你能在下面点个赞和在看支持我,谢谢!
本文分享自 Python与Excel之交 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!