用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写的贪吃蛇游戏例子
Jun 16 Python
用Python进行一些简单的自然语言处理的教程
Mar 31 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python 3中的yield from语法详解
Jan 18 Python
python 全文检索引擎详解
Apr 25 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
如何用Python合并lmdb文件
Jul 02 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
python中metaclass原理与用法详解
Jun 25 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
Python openpyxl 插入折线图实例
Apr 17 Python
解决echarts中饼图标签重叠的问题
May 16 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程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
PHP中让json_encode不自动转义斜杠“/”的方法
2017/02/28 PHP
PHP $O00OO0=urldecode & eval 解密,记一次商业源码的去后门
2020/09/13 PHP
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
超棒的javascript页面顶部卷动广告效果
2007/12/01 Javascript
JavaScript 常用函数
2009/12/30 Javascript
图解JavaScript中的this关键字
2020/05/28 Javascript
js判断节假日实例代码
2017/12/27 Javascript
React Navigation 使用中遇到的问题小结
2018/05/08 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
node Buffer缓存区常见操作示例
2019/05/04 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
python中实现k-means聚类算法详解
2017/11/11 Python
浅谈python常用程序算法
2019/03/22 Python
Python中字符串与编码示例代码
2019/05/20 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
Python模块zipfile原理及使用方法详解
2020/08/04 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
解决PDF 转图片时丢文字的一种可能方式
2021/03/04 Python
HTML5 canvas 瀑布流文字效果的示例代码
2018/01/31 HTML / CSS
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
俄罗斯运动、健康和美容产品在线商店:Lactomin.ru
2020/07/23 全球购物
澳大利亚美容产品及化妆品在线:Activeskin
2020/06/03 全球购物
Java程序员面试题
2016/09/27 面试题
专升本自我鉴定
2013/10/10 职场文书
机械专业毕业生自荐信
2013/11/02 职场文书
军训 自我鉴定
2014/02/03 职场文书
实用的简历自我评价
2014/03/06 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
老人节主持词
2015/07/04 职场文书
2015初一年级组工作总结
2015/07/24 职场文书
宝宝满月宴答谢词
2015/09/30 职场文书
springboot实现string转json json里面带数组
2022/06/16 Java/Android