用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 27 Python
python开发之for循环操作实例详解
Nov 12 Python
python3使用pyqt5制作一个超简单浏览器的实例
Oct 19 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
python写入并获取剪切板内容的实例
May 31 Python
python3 面向对象__类的内置属性与方法的实例代码
Nov 09 Python
Python面向对象程序设计之私有属性及私有方法示例
Apr 08 Python
详解Python3定时器任务代码
Sep 23 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
在django中使用apscheduler 执行计划任务的实现方法
Feb 11 Python
Python之字符串的遍历的4种方式
Dec 08 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
Feb 20 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
基于mysql的bbs设计(四)
2006/10/09 PHP
php 进度条实现代码
2009/03/10 PHP
php把session写入数据库示例
2014/02/26 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
PHP面向对象五大原则之开放-封闭原则(OCP)详解
2018/04/04 PHP
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
Jquery阻止事件冒泡 event.stopPropagation
2011/12/11 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
详解JavaScript中的4种类型识别方法
2015/09/14 Javascript
JS将滑动门改为选项卡(需鼠标点击)的实现方法
2015/09/27 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
JS组件Bootstrap Table使用实例分享
2016/05/30 Javascript
javascript 中Cookie读、写与删除操作
2017/03/29 Javascript
jQuery动态添加.active 实现导航效果代码思路详解
2017/08/29 jQuery
PM2自动部署代码步骤流程总结
2018/12/10 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
Python编程之多态用法实例详解
2015/05/19 Python
Python数据库的连接实现方法与注意事项
2016/02/27 Python
教你利用Python玩转histogram直方图的五种方法
2018/07/30 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
CSS3截取字符串实例代码【推荐】
2018/06/07 HTML / CSS
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
自1926年以来就为冰岛保持温暖:66°North
2020/11/27 全球购物
城市轨道交通工程职业规划书范文
2014/01/18 职场文书
大学辅导员述职报告
2015/01/10 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js
阿里云服务器部署mongodb的详细过程
2021/09/04 MongoDB
CSS3实现360度循环旋转功能
2022/02/12 HTML / CSS