从Matplotlib.pngs创建动画

bcs8qyzn  于 2023-08-06  发布在  其他
关注(0)|答案(3)|浏览(100)

你好,我刚写了一个计算氢原子轨道的代码。我写了一个for循环来使用命令创建300张图片

plt.savefig("image{i}.png".format(i=i))

字符串
现在我想问的是,使用Python从图片中创建高质量的.mp4或.gif文件的最简单方法是什么。我看到了几个教程,没有帮助我,因为gif是混乱的或质量太低。
谢谢你的支持

2mbi3lxu

2mbi3lxu1#

我知道的最简单的是使用imageiomimwrite

import imageio
ims = [imageio.imread(f) for f in list_of_im_paths]
imageio.mimwrite(path_to_save_gif, ims)

字符串
有明显的选项,如持续时间,循环次数等。
您可以在文档中了解到使用imageio.help('gif')的其他一些选项。
希望能帮上忙。

xfyts7mz

xfyts7mz2#

更快的方法是使用imageio,就像@ShlomiF的answer一样,但是如果你喜欢的话,你也可以用纯matplotlib来做同样的事情:

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

nframes = 25
plt.subplots_adjust(top=1, bottom=0, left=0, right=1)

def animate(i):
    im = plt.imread('image'+str(i)+'.png')
    plt.imshow(im)

anim = FuncAnimation(plt.gcf(), animate, frames=nframes, interval=(2000.0/nframes))
anim.save('output.gif', writer='imagemagick')

字符串
但如果您的首要任务是输出质量,您可能需要考虑直接使用ffmpegconvert

ffmpeg -f image2 -i image%d.png output.mp4
ffmpeg -i output.mp4 -vf "fps=10,scale=320:-1:flags=lanczos" -c:v pam -f image2pipe - | \
          convert -delay 10 - -loop 0 -layers optimize output.gif

的数据
根据需要更改scale参数以控制最终输出的大小,scale=-1:-1保持大小不变。

rseugnpd

rseugnpd3#

我也发现gif的质量太差,所以寻求一个解决方案,使mp4具有更高的分辨率和播放控制。我还没有找到一个mp4解决方案,但我已经能够使用Python cv2库编写.avi电影文件。下面是一个例子:

import cv2 

# Create avi movie from static plots created of each time slice
image_folder = 'path_to_png_files'
video_name = '/mov-{}.avi'.format('optional label')

# Store individual frames into list
images = [img for img in os.listdir(image_folder) if img.endswith(".png")]

# Create frame dimension and store its shape dimensions
frame = cv2.imread(os.path.join(image_folder, images[0]))
height, width, layers = frame.shape

# cv2's VideoWriter object will create a frame 
video = cv2.VideoWriter(avi_path + video_name, 0, 1, (width,height))

# Create the video from individual images using for loop
for image in images:
    video.write(cv2.imread(os.path.join(image_folder, image)))

# Close all the frames
cv2.destroyAllWindows()

# Release the video write object
video.release()

字符串

相关问题