用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中enumerate的用法实例解析
Aug 18 Python
python实现忽略大小写对字符串列表排序的方法
Sep 25 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
Python pymongo模块用法示例
Mar 31 Python
python3解析库pyquery的深入讲解
Jun 26 Python
Python去除字符串前后空格的几种方法
Mar 04 Python
pandas.read_csv参数详解(小结)
Jun 21 Python
python interpolate插值实例
Jul 06 Python
python 常见的反爬虫策略
Sep 27 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
Python3.9.1中使用match方法详解
Feb 08 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
PHP OPP机制和模式简介(抽象类、接口和契约式编程)
2014/06/09 PHP
php实现的短网址算法分享
2014/06/20 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
PHP数据库操作二:memcache用法分析
2017/08/16 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
jQuery AjaxQueue改进步骤
2011/10/06 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
全面了解addEventListener和on的区别
2016/07/14 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
详解vue中点击空白处隐藏div的实现(用指令实现)
2018/04/19 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
PHP webshell检查工具 python实现代码
2009/09/15 Python
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
Django上使用数据可视化利器Bokeh解析
2019/07/31 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
如何在python中实现随机选择
2019/11/02 Python
Python selenium爬取微信公众号文章代码详解
2020/08/12 Python
瑞士灯具购物网站:Lampenwelt.ch
2018/07/08 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
体育教育专业自荐信范文
2013/12/20 职场文书
优秀毕业生求职信范文
2014/01/02 职场文书
医院护士见习期自我鉴定
2014/04/10 职场文书
自愿离婚协议书范本
2014/09/13 职场文书
教您:房贷工资收入证明应该怎么写?
2019/08/19 职场文书
React Hook用法示例详解(6个常见hook)
2021/04/28 Javascript
一次线上mongo慢查询问题排查处理记录
2022/03/18 MongoDB
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫