用Python将GIF动图分解成多张静态图片


Posted in Python onJune 11, 2021

需求

有时候你看到一张动态图片,其中的一个画面你觉得很不错,想从中提取出来。例如以下这张由多个漂亮小姐姐组成的 GIF 动态图:

用Python将GIF动图分解成多张静态图片

实现

GIF 动态图片是由多张静态图片组合而成,按照一定的顺序和时间进行播放。基于此,能不能将 GIF 图片反向分解成一张张静态图呢?即 GIF 图片有多少帧,就有多少张静态图片。答案是肯定的! 都有现成的工具,有免费的,有付费的,有在线版的;还有些专门处理 GIF 动态图片的强大工具。

不过,作为 IT 人,不试试自己实现吗?初学编程,可以练练手;高手可 DIY 可扩展,不受限制,“无拘无束”!

那么,如何用代码实现这个需求呢?有人说,“Python 除了不会生孩子,什么都会。”这件区区小事,Python 实现也当然不在话下了!这是一个图像处理问题,Python Imaging Library 这不是 PIL 库吗? PIL 已经是 Python 平台事实上的图像处理标准库了。PIL 功能非常强大,但 API 却非常简单易用。不过,

由于 PIL 仅支持到 Python 2.7,加上年久失修,于是一群志愿者在 PIL 的基础上创建了兼容的版本,名字叫 Pillow,支持最新 Python 3.x,又加入了许多新特性,因此,我们可以直接安装使用 Pillow。

在 Pillow 中,有一个模块是专门实现动态图片提取功能的,这就是 ImageSequence 模块,这个模块包含一个包装器类,可以帮助用户迭代图像序列的帧。它可以遍历动画、 GIF 等 。 此类接受一个图像对象作为参数。它实现了一个迭代器对象,用户可以使用该对象在图像序列上进行迭代。其语法为:

classPIL.ImageSequence.Iterator(im)

通过以上的了解,我们就可以小试牛刀了,如果你还没安装 Pillow,可以通过 pip 进行安装: pip install pillow 。由于时间关系,我已经安装好了。另外,你还可以通过 pip list 命令列出安装了的 Python 包,看是否已经安装了 Pillow。

用Python将GIF动图分解成多张静态图片

再接着,不废话,直接上 Demo 代码:

from PIL import Image, ImageSequence

with Image.open("girls-min.gif") as im:
    index = 1
    for frame in ImageSequence.Iterator(im):
        frame.save(f"girl{index}.png")
        index += 1

最终效果如下图所示,再调整优化,完善完善即可:

用Python将GIF动图分解成多张静态图片

参考

pillow库的基础使用教程

How-To Geek : What Is a GIF, and How Do You Use Them?

Pillow : ImageSequence Module

到此这篇关于用Python将GIF动图分解成多张静态图片的文章就介绍到这了,更多相关Python分解图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
简单使用Python自动生成文章
Dec 25 Python
Python实现抓取城市的PM2.5浓度和排名
Mar 19 Python
谈谈python中GUI的选择
Mar 01 Python
Python对数据进行插值和下采样的方法
Jul 03 Python
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
Django 后台获取文件列表 InMemoryUploadedFile的例子
Aug 07 Python
python如何获取apk的packagename和activity
Jan 10 Python
Python3使用腾讯云文字识别(腾讯OCR)提取图片中的文字内容实例详解
Feb 18 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 Python
变长双向rnn的正确使用姿势教学
May 31 Python
python中 .npy文件的读写操作实例
Apr 14 Python
OpenCV-Python 实现两张图片自动拼接成全景图
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
PyQt5结合QtDesigner实现文本框读写操作
Python中seaborn库之countplot的数据可视化使用
Python爬取某拍短视频
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
You might like
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
PHP字符串比较函数strcmp()和strcasecmp()使用总结
2014/11/19 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP getName()函数讲解
2019/02/03 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
javascript整除实现代码
2010/11/23 Javascript
JSDoc 介绍使用规范JsDoc的使用介绍
2011/02/12 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
解决jquery插件冲突的问题
2014/01/23 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
工厂模式在JS中的实践
2017/01/18 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
Vue.js 十五分钟入门图文教程
2018/09/12 Javascript
小程序实现留言板
2018/11/02 Javascript
解决JQuery的ajax函数执行失败alert函数弹框一闪而过问题
2019/04/10 jQuery
js实现列表按字母排序
2020/08/11 Javascript
vue自定义插件封装,实现简易的elementUi的Message和MessageBox的示例
2020/11/20 Vue.js
[03:12]完美世界DOTA2联赛PWL DAY7集锦
2020/11/06 DOTA
基于Python的身份证号码自动生成程序
2014/08/15 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
对Python _取log的几种方式小结
2019/07/25 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
python如何实现读取并显示图片(不需要图形界面)
2020/07/08 Python
深入了解NumPy 高级索引
2020/07/24 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
python 制作本地应用搜索工具
2021/02/27 Python
使用phonegap进行提示操作的具体方法
2017/03/30 HTML / CSS
介绍一下你对SOA的认识
2016/04/24 面试题
电气自动化自荐信
2013/10/10 职场文书
物业管理计划书
2014/01/10 职场文书
出纳员的岗位职责
2014/02/22 职场文书
应用心理学专业求职信
2014/08/04 职场文书
护士个人年终总结
2015/02/13 职场文书
小学入学感言
2015/08/01 职场文书
幼儿园托班开学寄语(2016秋季)
2015/12/03 职场文书