用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遍历目录的方法小结
Apr 28 Python
Python面向对象之继承代码详解
Jan 29 Python
Python+tkinter使用40行代码实现计算器功能
Jan 30 Python
python pcm音频添加头转成Wav格式文件的方法
Jan 09 Python
简单了解Django应用app及分布式路由
Jul 24 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
Jul 09 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
python实现人性化显示金额数字实例详解
Sep 25 Python
Python趣味挑战之给幼儿园弟弟生成1000道算术题
May 28 Python
Python将CSV文件转化为HTML文件的操作方法
Jun 30 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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/10/09 PHP
采集邮箱的php代码(抓取网页中的邮箱地址)
2012/07/17 PHP
PHP爆绝对路径方法收集整理
2012/09/17 PHP
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
ThinkPHP基本的增删查改操作实例教程
2014/08/22 PHP
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
jquery 表单进行客户端验证demo
2009/08/24 Javascript
js setattribute批量设置css样式
2009/11/26 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
jquery关于图形报表的运用实现代码
2011/01/06 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
解析Jquery取得iframe中元素的几种方法
2013/07/04 Javascript
javascript实现修改微信分享的标题内容等
2014/12/11 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
jQuery移动页面开发中的触摸事件与虚拟鼠标事件简介
2015/12/03 Javascript
深入理解Angular2 模板语法
2016/08/07 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
js模式化窗口问题![window.dialogArguments]
2016/10/30 Javascript
详解如何理解vue的key属性
2019/04/14 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
python实现对一个完整url进行分割的方法
2015/04/29 Python
浅谈python对象数据的读写权限
2016/09/12 Python
Python利用正则表达式实现计算器算法思路解析
2018/04/25 Python
使用python实现语音文件的特征提取方法
2019/01/09 Python
python3中sorted函数里cmp参数改变详解
2020/03/12 Python
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
党员入党表决心的话
2014/03/11 职场文书
岳庙导游词
2015/02/04 职场文书
优秀共产党员主要事迹材料
2015/11/05 职场文书
《角的初步认识》教学反思
2016/02/17 职场文书
公文写作:工伤事故分析报告怎么写?
2019/11/05 职场文书
500字作文之关于爸爸
2019/11/14 职场文书