用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简单实现操作Mysql数据库
Jan 29 Python
Python处理命令行参数模块optpars用法实例分析
May 31 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
python模拟登陆,用session维持回话的实例
Dec 27 Python
Python File(文件) 方法整理
Feb 18 Python
django数据库自动重连的方法实例
Jul 21 Python
python实现操作文件(文件夹)
Oct 31 Python
常用的10个Python实用小技巧
Aug 10 Python
python 深度学习中的4种激活函数
Sep 18 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
pytorch中的model.eval()和BN层的使用
May 22 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/11/25 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
2011/10/15 PHP
解析posix与perl标准的正则表达式区别
2013/06/17 PHP
PHP实现QQ、微信和支付宝三合一收款码实例代码
2018/02/19 PHP
php is_numberic函数造成的SQL注入漏洞
2014/03/10 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
适用于手机端的jQuery图片滑块动画
2016/12/09 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
Javascript中类式继承和原型式继承的实现方法和区别之处
2017/04/25 Javascript
ES6学习教程之对象的扩展详解
2017/05/02 Javascript
layui--js控制switch的切换方法
2019/09/03 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
Vant 在vue-cli 4.x中按需加载操作
2020/11/05 Javascript
详解vue中在父组件点击按钮触发子组件的事件
2020/11/13 Javascript
Django框架下在视图中使用模版的方法
2015/07/16 Python
Python字符串匹配算法KMP实例
2015/07/18 Python
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python3.5运算符操作实例详解
2019/04/25 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
python实现移动木板小游戏
2020/10/09 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
中国一家专注拼团的社交购物网站:拼多多
2018/06/13 全球购物
JD Sports澳洲官网:英国领先的运动鞋和运动时尚零售商
2020/02/15 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
演讲稿开场白
2014/01/13 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
任命书模板
2014/06/04 职场文书
品质标语大全
2014/06/21 职场文书
大学生村官入党自传
2015/06/26 职场文书
高温慰问简报
2015/07/21 职场文书
go xorm框架的使用
2021/05/22 Golang