用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编程中包的概念与管理
Oct 16 Python
python实现报表自动化详解
Nov 16 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
python基础教程项目四之新闻聚合
Apr 02 Python
无法使用pip命令安装python第三方库的原因及解决方法
Jun 12 Python
Python面向对象程序设计示例小结
Jan 30 Python
python开发游戏的前期准备
May 05 Python
处理Selenium3+python3定位鼠标悬停才显示的元素
Jul 31 Python
如何在Cloud Studio上执行Python代码?
Aug 09 Python
django重新生成数据库中的某张表方法
Aug 28 Python
详细分析Python垃圾回收机制
Jul 01 Python
Python如何把字典写入到CSV文件的方法示例
Aug 23 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 Rename 更改文件、文件夹名称
2011/05/24 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
php curl简单采集图片生成base64编码(并附curl函数参数说明)
2019/02/15 PHP
拖动一个HTML元素
2006/12/22 Javascript
用JS实现的一个include函数
2007/07/21 Javascript
JavaScript 序列化对象实现代码
2009/12/18 Javascript
chrome调试javascript详解
2015/10/21 Javascript
jQuery+jsp下拉框联动获取本地数据的方法(附源码)
2015/12/03 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
小程序云开发实战小结
2018/10/25 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
JS实现的雪花飘落特效示例
2019/12/03 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
[10:49]2014国际邀请赛 叨叨刀塔第二期为真正的电竞喝彩
2014/07/21 DOTA
Python实现telnet服务器的方法
2015/07/10 Python
Python网络爬虫项目:内容提取器的定义
2016/10/25 Python
python实现微信自动回复功能
2018/04/11 Python
Python 机器学习库 NumPy入门教程
2018/04/19 Python
Python中函数参数调用方式分析
2018/08/09 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
Django用户登录与注册系统的实现示例
2020/06/03 Python
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
函授毕业生自我鉴定
2013/11/06 职场文书
美德好少年主要事迹
2014/01/29 职场文书
阳光体育活动总结
2014/04/30 职场文书
Python入门之基础语法详解
2021/05/11 Python