## 最终的实现效果
先来看看我们要实现什么效果:
原图:
处理后:
非灰度的
灰度的
实现思路
理解这一思路需要稍有些图像处理基础。gif实际上是多帧图片按照一定的播放速度逐帧播放,又由于视觉停留的生理现象,所以才“动”起来。
基于GIF这一思路,因此若想要实现上述效果,大致思路为:拆帧-处理-合帧。具体描述为:
- 获取GIF的各个帧的图片
- 逐个处理各个帧的图片,如把各个帧的图片处理成灰度字符图
- 将步骤2处理后的各帧图片,按照原始次序,再合并为新GIF并输出。
今天我们主要介绍一下第一步,即,如何获取到GIF的各个帧。
涉及的主要库
Python的Image库:Pillow
可以链接查看其各个模块的详细使用文档,如下文使用的Image.open
,Image.tell
,Image.save
,Image.seek
。
主要代码
获取各个帧
1 | import os |
函数解读
Image.open(fp, mode=’r’, formats=None)
官方文档描述如下:
1 | Opens and identifies the given image file. |
大概意思是:打开并标识给定的图片文件,并且是一个惰性操作,标记文件并保持打开状态,直到尝试处理数据时才读取实际的图像数据。
Image.tell()
1 | Returns the current frame number. See seek(). |
翻译过来就是范围当前的帧号,从0开始。
Image.seek(frame)
1 | Seeks to the given frame in this sequence file. If you seek beyond the end of the sequence, the method raises an EOFError exception. When a sequence file is opened, the library automatically seeks to frame 0. |
翻译过来,大概意思是查找序列文件中的给定帧,超出序列末尾则会引发异常,如果一个打开一个序列文件,则自动指向第0帧。