用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 相关文章推荐
Django中处理出错页面的方法
Jul 15 Python
python 简单的多线程链接实现代码
Aug 28 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 Python
python 函数内部修改外部变量的方法
Dec 18 Python
python pandas库的安装和创建
Jan 10 Python
浅谈Python中eval的强大与危害
Mar 13 Python
详解Python3网络爬虫(二):利用urllib.urlopen向有道翻译发送数据获得翻译结果
May 07 Python
python通过matplotlib生成复合饼图
Feb 06 Python
python如何提取英语pdf内容并翻译
Mar 03 Python
Python任务自动化工具tox使用教程
Mar 17 Python
Python脚本如何在bilibili中查找弹幕发送者
Jun 04 Python
Python xlwings插入Excel图片的实现方法
Feb 26 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
thinkphp模板继承实例简述
2014/11/26 PHP
PHP Reflection API详解
2015/05/12 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
js replace正则表达式应用案例讲解
2013/01/17 Javascript
使用jQuery清空file文件域的解决方案
2013/04/12 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
jquery不常用方法汇总
2015/07/26 Javascript
javascript密码强度校验代码(两种方法)
2015/08/10 Javascript
javascript作用域、作用域链(菜鸟必看)
2016/06/16 Javascript
jQuery弹出层后禁用底部滚动条(移动端关闭回到原位置)
2016/08/29 Javascript
手机软键盘弹出时影响布局的解决方法
2016/12/15 Javascript
Vue中使用vux的配置详解
2017/05/05 Javascript
angular中的cookie读写方法
2017/08/02 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
js实现页面多个日期时间倒计时效果
2019/06/20 Javascript
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
Python 实现简单的客户端认证
2020/07/29 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
python 发送get请求接口详解
2020/11/17 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
IE浏览器单独写CSS样式的几种方法
2014/10/14 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
党员批评与自我批评范文
2014/09/23 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书
JavaScript的Set数据结构详解
2022/02/18 Javascript