是否可以仅使用枕头库生成 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)
我希望能够将 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)