用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 不关闭控制台的实现方法
Oct 23 Python
Python bsddb模块操作Berkeley DB数据库介绍
Apr 08 Python
Python3里的super()和__class__使用介绍
Apr 23 Python
python统计文本文件内单词数量的方法
May 30 Python
Python基于time模块求程序运行时间的方法
Sep 18 Python
Python及Django框架生成二维码的方法分析
Jan 31 Python
flask入门之表单的实现
Jul 18 Python
Python爬虫beautifulsoup4常用的解析方法总结
Feb 25 Python
Python3.4解释器用法简单示例
Mar 22 Python
python中if及if-else如何使用
Jun 02 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
Aug 17 Python
python分分钟绘制精美地图海报
Feb 15 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
ajax php 实现写入数据库
2009/09/02 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
PHP易混淆函数的区别及用法汇总
2014/11/22 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
jquery星级插件、支持页面中多次使用
2012/03/25 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
获取表单控件原始(初始)值的方法
2013/08/21 Javascript
javascript中数组中求最大值示例代码
2013/12/18 Javascript
jquery实现点击弹出层效果的简单实例
2014/03/03 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
根据user-agent判断蜘蛛代码黑帽跳转代码(js版与php版本)
2015/09/14 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
作为老司机使用 React 总结的 11 个经验教训
2017/04/08 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
vue页面跳转后返回原页面初始位置方法
2018/02/11 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
纯js+css实现仿移动端淘宝网站的弹出详情框功能
2019/12/29 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
python实现的重启关机程序实例
2014/08/21 Python
深入理解 Python 中的多线程 新手必看
2016/11/20 Python
Python列表list常用内建函数实例小结
2019/10/22 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
5个你不知道的HTML5的接口介绍
2013/08/07 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
新电JAVA笔试题目
2014/08/31 面试题
助人为乐表扬信范文
2014/01/14 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
Python Matplotlib绘制两个Y轴图像
2022/04/13 Python
Windows Server 2012 R2服务器安装与配置的完整步骤
2022/07/15 Servers