是否可以仅使用枕头库生成 gif 动画?

Is it possible to generate a gif animation using pillow library only?

我希望能够将 numpy 数组转换为图像。首先,我学习了如何将 3D (hight x width x color) 数组转换为图像。经过一些研究,我认为 PIL(或 Pillow)是最自然的方式。这就是我目前的做法(而且效果很好):

from PIL import Image
import numpy as np

if __name__ == '__main__':
    h = 4
    w = 8
    arr = np.zeros((h,w,3), dtype=np.uint8)

    arr[0, 0, :] = [255,255,0]
    arr[3, 7, :] = [0,255,0]

    img = Image.fromarray(arr, 'RGB')
    img.save('viz.png')

作为下一步,我希望能够获取 3D 数组(或 4D 数组,其中时间是附加维度)的列表并生成相应的动画。所以,到目前为止我还没有找到怎么做。

Pillow 似乎可以读取 gif 动画。使用 ImageSequence 我们可以访问它的帧。但是,我不知道如何将一系列图像放入动画中。

我看到了一些使用 ìmages2gif 的解决方案,但我想继续使用单个库。

已添加

答案here 没有回答我的问题。他们使用 gifmaker 我什至无法通过 pip 安装的库。

因此,问题的主要反对意见是生成由 3D 数组(帧)列表或 4D 矩阵(以宽度、高度、颜色和时间为维度)表示的 gif 动画,而不使用"external" 到 Python 的工具。

看起来 PIL 库无法做到这一点。至少在没有黑客攻击或解决方法的情况下,不是以一种简单的方式。但是,可以通过使用 moviepy 库来实现该目标。这是这个库提供的优雅解决方案:

import numpy as np
import moviepy.editor as mpy

def make_frame(t):

    h = 100
    w = 100

    ar = np.zeros((h, w, 3))

    for hi in range(h):
        for wi in range(w):
            for ci in range(3):
                ar[hi, wi, ci] = 255.0*t/15.0
    return ar


if __name__ == '__main__':

    clip = mpy.VideoClip(make_frame, duration=15.0)
    clip.write_gif('ani.gif', fps=15)