用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实现复制整个目录的方法
May 12 Python
Python实现统计单词出现的个数
May 28 Python
python实现隐马尔科夫模型HMM
Mar 25 Python
Django项目实战之用户头像上传与访问的示例
Apr 21 Python
对python中raw_input()和input()的用法详解
Apr 22 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
python的继承知识点总结
Dec 10 Python
将python图片转为二进制文本的实例
Jan 24 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
python函数声明和调用定义及原理详解
Dec 02 Python
wxpython多线程防假死与线程间传递消息实例详解
Dec 13 Python
pyinstaller将含有多个py文件的python程序做成exe
Apr 29 Python
OpenCV-Python 实现两张图片自动拼接成全景图
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
PyQt5结合QtDesigner实现文本框读写操作
Python中seaborn库之countplot的数据可视化使用
Python爬取某拍短视频
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
You might like
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
php socket方式提交的post详解
2008/07/19 PHP
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
php中require和require_once的区别说明
2014/02/27 PHP
PHP邮件发送类PHPMailer用法实例详解
2014/09/22 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
js下用层来实现select的title提示属性
2010/02/23 Javascript
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
JavaScript高级程序设计阅读笔记(五) ECMAScript中的运算符(一)
2012/02/27 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
一个JavaScript变量声明的知识点
2013/10/28 Javascript
js中window.open打开一个新的页面
2014/08/10 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
微信小程序 图片上传实例详解
2017/05/05 Javascript
vue父组件向子组件(props)传递数据的方法
2018/01/02 Javascript
基于vue 动态加载图片src的解决方法
2018/02/05 Javascript
安装Node.js并启动本地服务的操作教程
2018/05/12 Javascript
详解如何使用koa实现socket.io官网的例子
2018/11/04 Javascript
面试题:react和vue的区别分析
2019/04/08 Javascript
vue中使用vee-validator完成表单校验方案
2019/11/01 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
jQuery实现移动端扭蛋机抽奖
2020/11/08 jQuery
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
python使用xpath中遇到:到底是什么?
2018/01/04 Python
使用pygame模块编写贪吃蛇的实例讲解
2018/02/05 Python
python实现Excel文件转换为TXT文件
2019/04/28 Python
Django中Middleware中的函数详解
2019/07/18 Python
python PyQt5/Pyside2 按钮右击菜单实例代码
2019/08/17 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
python如何绘制疫情图
2020/09/16 Python
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
extern是什么意思
2016/03/10 面试题
php去除数组中为0的元素的实例分析
2021/11/17 PHP