用Python将动态GIF图片倒放播放的方法


Posted in Python onNovember 02, 2016

这次让我们一个用 Python 做一个小工具:将动态 GIF 图片倒序播放!

用Python将动态GIF图片倒放播放的方法

GIF(Graphics Interchange Format) 是一种可以用来呈现动画效果的图片格式,原理就是保存很多帧(Frame)静态图像,然后连续呈现。很多简短的视频也会被转换成动态 GIF 呈现,压缩画质和去除声音之后可以有效地减小文件大小。网络上不计其数的搞笑动图,几乎承载了网友大半的欢乐,但是也有人发现,将正常的动画倒序播放往往可以获得更搞笑的效果,Reddit 上甚至有一个专门的节点:/r/reversegif。

要做到这一点其实很简单,只要从原始图片中提取中间每一帧静态图像,然后将顺序颠倒之后重新生成一张 GIF 图片即可。Python 中专门用于处理图像的库是 PIL,在 PIL 基础上由 Alex Clark 等人开发了一个更友好的版本:Pillow。于是首先来安装(或升级)Pillow:

pip install --upgrade pillow -i http://pypi.douban.com/simple
python -c "import PIL; print(PIL.VERSION, '\t', PIL.PILLOW_VERSION)"
// 1.1.7 3.4.2
利用 Pillow 可以先读取图片文件并判断该图片是否为动态图片及其帧数:
from PIL import Imagewith Image.open('ani.gif') as im:
print(im.is_animated, im.n_frames)

新版本的 Pillow 提供了更多写入 GIF 的功能:

im.save(out, save_all=True, append_images=[im1, im2, ...])

通过设定 save_all=True 参数和 append_images 可以一次性将多帧图像同时存入 GIF 图片,于是我们可以这样来生成倒序播放的图片:

from PIL import Image, ImageSequence
with Image.open('ani.gif') as im:
if im.is_animated:
frames = [f.copy() for f in ImageSequence.Iterator(im)]
frames.reverse() # 内置列表倒序方法
# 将倒序后的所有帧图像保存下来
frames[0].save('out.gif', save_all=True, append_images=frames[1:])

用Python将动态GIF图片倒放播放的方法

再来看一个比较明显的效果:

用Python将动态GIF图片倒放播放的方法

为了满足微信2M 图片大小限制,倒序图片经过了采样压缩处理

如果想要达到鬼畜一些的效果,还可以对所有帧随机打乱顺序:

import random
# frames.reverse()
random.shuffle(frames)

效果如下:

用Python将动态GIF图片倒放播放的方法

以上所述是小编给大家介绍的用Python将动态GIF图片倒放播放的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python聚类算法之基本K均值实例详解
Nov 20 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
使用python获取csv文本的某行或某列数据的实例
Apr 03 Python
Tensorflow卷积神经网络实例进阶
May 24 Python
python2.x实现人民币转大写人民币
Jun 20 Python
python3 kmp 字符串匹配的方法
Jul 07 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
Aug 16 Python
python修改txt文件中的某一项方法
Dec 29 Python
python  文件的基本操作 菜中菜功能的实例代码
Jul 17 Python
tensorflow 限制显存大小的实现
Feb 03 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 #Python
Python实现简单的四则运算计算器
Nov 02 #Python
利用Python命令行传递实例化对象的方法
Nov 02 #Python
Python 性能优化技巧总结
Nov 01 #Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 #Python
浅谈django中的认证与登录
Oct 31 #Python
python 把数据 json格式输出的实例代码
Oct 31 #Python
You might like
点评山进PR-D3L三波段收音机
2021/03/02 无线电
如何利用php+mysql保存和输出文件
2006/10/09 PHP
在PHP中使用X-SendFile头让文件下载更快
2014/06/01 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
php通过文件头判断格式的方法
2016/05/28 PHP
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
自定义jQuery插件方式实现强制对象重绘的方法
2015/03/23 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
javascript判断回文数详解及实现代码
2017/02/03 Javascript
nodejs个人博客开发第六步 数据分页
2017/04/12 NodeJs
详解JavaScript添加给定的标签选项
2018/09/17 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
关于vue.js中实现方法内某些代码延时执行
2019/11/14 Javascript
小程序实现左滑删除的效果的实例代码
2020/10/19 Javascript
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
Python使用turtule画五角星的方法
2015/07/09 Python
详解使用python的logging模块在stdout输出的两种方法
2017/05/17 Python
利用python求解物理学中的双弹簧质能系统详解
2017/09/29 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
简单谈谈python基本数据类型
2018/09/26 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
Python numpy大矩阵运算内存不足如何解决
2020/11/19 Python
Python LMDB库的使用示例
2021/02/14 Python
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
介绍一下linux的文件权限
2012/02/15 面试题
出纳岗位职责范本
2013/12/01 职场文书
快递业务员岗位职责
2014/01/06 职场文书
九年级数学教学反思
2014/02/02 职场文书
股份合作协议书
2014/04/12 职场文书
安全生产一岗双责责任书
2014/07/28 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
债务纠纷起诉书
2015/05/20 职场文书