用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的垃圾回收机制深入分析
Jul 16 Python
玩转python爬虫之正则表达式
Feb 17 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
在Python中调用Ping命令,批量IP的方法
Jan 26 Python
python将视频转换为全字符视频
Apr 26 Python
Python3.8中使用f-strings调试
May 22 Python
Python发展史及网络爬虫
Jun 19 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
DataFrame.groupby()所见的各种用法详解
Jun 14 Python
python爬虫数据保存到mongoDB的实例方法
Jul 28 Python
OpenCV-Python 实现两张图片自动拼接成全景图
matplotlib如何设置坐标轴刻度的个数及标签的方法总结
PyQt5结合QtDesigner实现文本框读写操作
Python中seaborn库之countplot的数据可视化使用
Python爬取某拍短视频
anaconda python3.8安装后降级
OpenCV-Python实现人脸美白算法的实例
You might like
PHP的可变变量名的使用方法分享
2012/02/05 PHP
使用php验证复选框有效性的示例
2013/11/13 PHP
C/S和B/S两种架构区别与优缺点分析
2014/10/23 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
Laravel5.1 框架数据库操作DB运行原生SQL的方法分析
2020/01/07 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
用AJAX返回HTML片段中的JavaScript脚本
2010/01/04 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
JavaScript中的闭包
2016/02/24 Javascript
Bootstrap3.0建站教程(一)之bootstrap表单元素排版
2016/06/01 Javascript
Bootstrap3 图片(响应式图片&图片形状)
2017/01/04 Javascript
从零学习node.js之详解异步控制工具async(八)
2017/02/27 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
JavaScript 有用的代码片段和 trick
2018/02/22 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
github配置使用指南
2014/11/18 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
python 开发的三种运行模式详细介绍
2017/01/18 Python
Python 12306抢火车票脚本
2018/02/07 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
python join方法使用详解
2019/07/30 Python
Python基于staticmethod装饰器标示静态方法
2020/10/17 Python
结婚典礼证婚词
2014/01/11 职场文书
职工趣味运动会方案
2014/02/10 职场文书
5s推行计划书
2014/05/06 职场文书
经销商年会策划方案
2014/05/29 职场文书
介绍长城的导游词
2015/01/30 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
三严三实学习心得体会(精选N篇)
2016/01/05 职场文书
高中数学教学反思范文
2016/02/18 职场文书
2016年度创先争优活动总结
2016/04/05 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书