用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 相关文章推荐
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
Jan 17 Python
详解用TensorFlow实现逻辑回归算法
May 02 Python
基于python3实现socket文件传输和校验
Jul 28 Python
对TensorFlow的assign赋值用法详解
Jul 30 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
Python如何读取、写入CSV数据
Jul 28 Python
django跳转页面传参的实现
Sep 17 Python
浅谈Python列表嵌套字典转化的问题
Apr 07 Python
Python竟然能剪辑视频
May 25 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初学者头疼问题总结
2006/07/08 PHP
用PHP+MySql编写聊天室
2006/10/09 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
javascript call方法使用说明
2010/01/11 Javascript
一个js的tab切换效果代码[代码分离]
2010/04/11 Javascript
用jquery实现下拉菜单效果的代码
2010/07/25 Javascript
基于JQuery实现相同内容合并单元格的代码
2011/01/12 Javascript
精通Javascript系列之数据类型 字符串
2011/06/08 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
JavaScript实现多种排序算法
2016/02/24 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
JS 终止执行的实现方法
2016/11/24 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
js实现多图和单图上传显示
2019/12/18 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
Python 自动化表单提交实例代码
2017/06/08 Python
python实现飞机大战游戏
2020/10/26 Python
Python接口测试get请求过程详解
2020/02/28 Python
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
什么是Assembly(程序集)
2014/09/14 面试题
咖啡书吧创业计划书
2014/01/13 职场文书
学校出纳员岗位职责
2014/03/18 职场文书
《和时间赛跑》读后感3篇
2019/12/16 职场文书