前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有趣!教你用python对GIF动图进行倒放、拆分、合成!

有趣!教你用python对GIF动图进行倒放、拆分、合成!

作者头像
Python与Excel之交
发布2021-08-05 15:45:30
1.6K0
发布2021-08-05 15:45:30
举报
文章被收录于专栏:Python与Excel之交Python与Excel之交

Hi~大家好!

今天教大家用python对GIF动图进行拆分、合成、倒放~

准备

导入相关库:

代码语言:javascript
复制
import os
import imageio
from PIL import Image, ImageSequence

os库是用来操作文件夹的,imageio库是用来合成GIF,PIL库大家应该都很熟悉,这次用到它的ImageImageSequence模块,用来实现GIF的读取和拆分。

所有库可以直接用pip命令进行安装:

代码语言:javascript
复制
pip install 库名

准备一张GIF动图,本文只要此动图的基础之上进行操作:

合成或者倒放GIF动图也可以使用其它若干张图片进行操作。

拆分

拆分相比合并和倒放容易很多,这里介绍两种方法。先用os在目录下创建一个名为拆分的文件夹:

代码语言:javascript
复制
if not os.path.exists('拆分'):
    os.makedirs('拆分')

第一种方法是使用Image模块下的seek函数,可以直接拆分;拆分后建议按顺序命名图片:

代码语言:javascript
复制
img = Image.open('噢特曼.gif') # 打开GIF动图
try:
    i = 1
    while True:
        img.seek(i) # 拆分
        img.save(f'拆分/{i}.png') # 保存
        i += 1
except:
    pass

第二种方法相比第一种简洁很多,用的是ImageSequence模块中的Iterator函数:

代码语言:javascript
复制
img = Image.open('噢特曼.gif')
i = 0
for f in ImageSequence.Iterator(img):  # 循环遍历GIF中的帧
    i += 1
    f.save(f'拆分/{i}.png')  # 保存

Iterator函数的源码可以看出,它其实是在seek函数基础之上进行封装的:

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

合并

imageio是个第三方库,它可以直接读取很多格式的图片和视频,然后可以将图片和视频转换成其它格式。本文用到的是imageio库的imreadmimsave函数,一个读取,一个保存:

代码语言:javascript
复制
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

代码语言:javascript
复制
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()进行帧的倒序排序,但效果不是很好,动图放着放着就会卡住,而且不能设置动图的每一帧的速度。

代码语言:javascript
复制
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:])  # 保存

效果预览:

以上便是今天的全部内容了,如果你喜欢今天的内容,希望你能在下面点个赞和在看支持我,谢谢!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python与Excel之交 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备
  • 拆分
  • 合并
  • 倒放
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档