Python PIL ImageSequence.Iterator()完整攻略
说明
PIL(Python Imaging Library)是Python扩展库,用于处理图像文件的读写以及处理等功能。ImageSequence
是PIL中的一个用于遍历图像序列的工具,Iterator()
方法是其中的一个重要函数,该函数通常被用于枚举图像文件中的所有帧,然后对它们进行操作或者构造生成新的图像。
使用方法
使用PIL.ImageSequence.Iterator()
方法遍历多帧的图片格式通常有两种情况:
- 对一帧图像进行操作,如压缩,修改像素等。
- 枚举整个图像序列,组成新的图像。
下面,我们将通过两个实例说明如何进行操作:
示例一
修改图片像素并保存成新图。
from PIL import Image, ImageSequence
im = Image.open('giphy.gif')
frames = []
for frame in ImageSequence.Iterator(im):
# 聚类最多256个颜色
frame = frame.quantize(colors=256)
# RGB 通道拆分 (R,G,B,A)
r, g, b, a = frame.split()
# 新建Alpha通道
alpha = Image.new(frame.mode, frame.size, color=(0, 0, 0, 0))
# 检查 R通道图片中非黑色像素,并将其填充到新 Alpha通道图片中
alpha.paste(a, (0, 0), mask=a)
# 将原始三个通道和新的Alpha通道重新发挥图像
frame = Image.merge('RGB', (r, g, b))
frame.putalpha(alpha)
# 将新的frame保存到帧列表中
frames.append(frame)
# 将新生成的gif 图片分别保存
frames[0].save('new_image.gif', save_all=True, append_images=frames[1:])
在例子中,我们打开了一个gif图片,并通过for
循环读取了图片的每一帧,用quantize
方法将图片的颜色减少到256,接着将RGB三个通道拆分,新建Alpha通道,并将原始Alpha通道中非黑色像素填充到新Alpha通道中,最后通过merge
方法将三个通道和新的Alpha通道重新组合为新的frame,并存入列表中最后生成新的gif图片。
示例二
枚举整个图像序列并放到一起,生成新的图像。
from PIL import Image, ImageSequence
# 合并ER 图片的每一帧
im = Image.open('er.gif')
frames = [frame.copy() for frame in ImageSequence.Iterator(im)]
ER_gif = frames.pop(0)
ER_gif.save('ER_image.gif', save_all=True, append_images=frames, duration=2)
在这个例子中,我们打开了一个gif图片,并通过for
循环读取图片的每一帧,用copy
方法将生成新的帧拷贝过来,并最终用append_images
方法将所有帧合并到一起,然后用save
方法保存生成的图片。值得注意的是,对于像gif这样的动态图,我们需要对生成的帧之间的时间间隔进行调整,并将其加到duration
参数中,这样动画才能正常展示。
结论
通过使用PIL.ImageSequence.Iterator()
方法,我们可以轻松枚举一个动态图像的所有帧,然后使用各种方法对其进行操作和修改。同时,通过将遍历得到的帧合并成新的动态图像,我们也可以方便地生成全新的动画效果。