详解Python PIL ImageSequence.Iterator()

  • Post category:Python

Python PIL ImageSequence.Iterator()完整攻略

说明

PIL(Python Imaging Library)是Python扩展库,用于处理图像文件的读写以及处理等功能。ImageSequence是PIL中的一个用于遍历图像序列的工具,Iterator()方法是其中的一个重要函数,该函数通常被用于枚举图像文件中的所有帧,然后对它们进行操作或者构造生成新的图像。

使用方法

使用PIL.ImageSequence.Iterator()方法遍历多帧的图片格式通常有两种情况:

  1. 对一帧图像进行操作,如压缩,修改像素等。
  2. 枚举整个图像序列,组成新的图像。

下面,我们将通过两个实例说明如何进行操作:

示例一

修改图片像素并保存成新图。

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()方法,我们可以轻松枚举一个动态图像的所有帧,然后使用各种方法对其进行操作和修改。同时,通过将遍历得到的帧合并成新的动态图像,我们也可以方便地生成全新的动画效果。