【问题标题】:Is it possible to generate a gif animation using pillow library only?是否可以仅使用枕头库生成 gif 动画?
【发布时间】:2016-07-23 22:49:19
【问题描述】:

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

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 的答案没有回答我的问题。他们使用我什至无法通过 pip 安装的 gifmaker 库。

【问题讨论】:

  • @Reti43,不,我想在 Pillow 中做,那里的答案使用 gifmaker
  • 这是一个来自 Pillow 的脚本,它是一个包装函数,用于使用特殊参数调用 Image.save()。这不适合你吗?
  • 在我可以尝试使用Image.save() 函数和save_all=True 选项之前,我首先需要弄清楚如何创建一个由多个帧组成的图像对象。用 3D 数组列表替换 3D 数组不起作用。
  • 好的,我现在明白了。很抱歉错过了这个细节。环顾四周后,我找不到任何证据表明 Pillow 支持您的要求,因此您可能必须创建一个修改后的 GifImagePlugin,或从 images2gif 复制代码,保存为动画 it gif 并将其重新加载到Image 对象。我知道,看起来都不理想。

标签: python animation python-imaging-library gif pillow


【解决方案1】:

因此,该问题的主要反对意见是生成由 3D 数组(帧)列表或 4D 矩阵(以宽度、高度、颜色和时间为维度)表示的 gif 动画,而无需使用以下工具:是 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 2021-05-26
    • 2012-05-16
    • 1970-01-01
    • 2012-05-07
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多