用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发送arp欺骗攻击代码分析
Jan 16 Python
vc6编写python扩展的方法分享
Jan 17 Python
pyqt4教程之实现半透明的天气预报界面示例
Mar 02 Python
Python中使用多进程来实现并行处理的方法小结
Aug 09 Python
利用TensorFlow训练简单的二分类神经网络模型的方法
Mar 05 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
Python Excel处理库openpyxl使用详解
May 09 Python
python实现while循环打印星星的四种形状
Nov 23 Python
Python实现把类当做字典来访问
Dec 16 Python
python 解决tqdm模块不能单行显示的问题
Feb 19 Python
python操作yaml说明
Apr 08 Python
Flask处理Web表单的实现方法
Jan 31 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
用PHP实现弹出消息提示框的两种方法
2013/12/17 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
js验证表单第二部分
2006/11/25 Javascript
javascript eval和JSON之间的联系
2009/12/31 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
Javascript 读取操作Sql中的Xml字段
2014/10/09 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
js实现鼠标点击左上角滑动菜单效果代码
2015/09/06 Javascript
详解堆的javascript实现方法
2016/11/29 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
ES6 javascript中class类的get与set用法实例分析
2017/10/30 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
2017/11/14 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
JavaScript设计模式之缓存代理模式原理与简单用法示例
2018/08/07 Javascript
[02:02]2018DOTA2亚洲邀请赛Mineski赛前采访
2018/04/04 DOTA
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
[01:31:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第二场 1月10日
2021/03/11 DOTA
python实现自动登录人人网并访问最近来访者实例
2014/09/26 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Python 单例设计模式用法实例分析
2019/09/23 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
html5中如何将图片的绝对路径转换成文件对象
2018/01/11 HTML / CSS
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
现金出纳岗位职责
2014/03/15 职场文书
班组长竞聘书
2014/03/31 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
寒假生活随笔
2015/08/15 职场文书
离婚协议书格式范本
2016/03/18 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python