用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实现批量按比例缩放图片效果
Mar 30 Python
python学习基础之循环import及import过程
Apr 22 Python
python:print格式化输出到文件的实例
May 14 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
Python基础之函数的定义与使用示例
Mar 23 Python
Python实现的爬取百度贴吧图片功能完整示例
May 10 Python
Python pip替换为阿里源的方法步骤
Jul 02 Python
python 实现一个反向单位矩阵示例
Nov 29 Python
安装PyInstaller失败问题解决
Dec 14 Python
Python xlrd模块导入过程及常用操作
Jun 10 Python
详解Python IO编程
Jul 24 Python
Python datetime模块的使用示例
Feb 02 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
第十三节 对象串行化 [13]
2006/10/09 PHP
coreseek 搜索英文的问题详解
2013/06/08 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
JavaScript类和继承 constructor属性
2010/03/04 Javascript
ext jquery 简单比较
2010/04/07 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
Array 重排序方法和操作方法的简单实例
2014/01/24 Javascript
jQuery实现带动画效果的多级下拉菜单代码
2015/09/08 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
微信小程序实现滑动翻页效果(完整代码)
2019/12/06 Javascript
小程序富文本提取图片可放大缩小
2020/05/26 Javascript
解决vue项目 build之后资源文件找不到的问题
2020/09/12 Javascript
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
Python返回数组/List长度的实例
2018/06/23 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
Python time库基本使用方法分析
2019/12/13 Python
Python 实现opencv所使用的图片格式与 base64 转换
2020/01/09 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
学python需要去培训机构吗
2020/07/01 Python
Python  word实现读取及导出代码解析
2020/07/09 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
吃透移动端 1px的具体用法
2019/12/16 HTML / CSS
会计专业毕业自荐书范文
2014/02/08 职场文书
预备党员转正考核材料
2014/06/03 职场文书
安全责任书怎么写
2014/07/28 职场文书
如何Python使用re模块实现okenizer
2022/04/30 Python