Matplotlib 调用ImageMagick输出gif文件

前面使用animation.PillowWriter对象来实现输出GIF文件,达到可以让动画轻松地在网页上展示,因为很多网站只支持GIF动画上传,并不支持MP4。不过,不知道你有没有发现,使用animation.PillowWriter对象生成的GIF的身体可能有点肥胖,这样上传的速度变慢,或者下载的速度也变慢,这时候或许要减肥了,那么就需要使用专门的转换软件–ImageMagick。

使用ImageMagick的创建,编辑,撰写,或转换位图图像。它可以读取和写入各种格式(超过200种)的图像,包括PNG,JPEG,GIF,HEIC,TIFF,DPX,EXR,WebP,Postscript,PDF和SVG。使用ImageMagick可以调整图像大小,翻转,镜像,旋转,变形,剪切和变换图像,调整图像颜色,应用各种特殊效果或绘制文本,线条,多边形,椭圆和贝塞尔曲线。

ImageMagick是免费软件,可以即用型二进制分发形式提供,也可以作为源代码提供,您可以在开放应用程序和专有应用程序中使用,复制,修改和分发它们。它是在派生的Apache 2.0 许可下分发的。

ImageMagick利用多个计算线程来提高性能,并且可以读取,处理或写入兆,千兆或兆像素图像大小。

ImageMagick的官网有:

https://imagemagick.org/index.php

http://www.imagemagick.com.cn/

在这里主要在官网上下载Windows平台的版本,其它版本可以参考网站的说明下载,如下:

Matplotlib 调用ImageMagick输出gif文件

在本文里下载后得到的文件名称为:

ImageMagick-7.0.10-53-Q16-HDRI-x64-dll.exe

这是使用最新的版本,为7.0,支持WIN 64位操作系统

然后双击这个文件就可以安装,我把它安装到目录:

Matplotlib 调用ImageMagick输出gif文件

到这里就可以把软件安装好了。接着下来,就是怎么样调用这个软件来转换成GIF文件,这个过程与前面文章里调用FFMPEG一样的,先写下面这行代码:

plt.rcParams['animation.convert_path'] = r'D:\ImageMagick\magick.exe'

这里就是设置了转换的文件路径,调用的程序是magick.exe,与旧的版本有区别,如果你是使用旧的matplotlib的例子,要注意这一点,否则找到旧的程序了。

接着下来,就是定义输出GIF文件的对象:

writer = animation.ImageMagickFileWriter(fps = 30)
anim.save('ani-057.gif', writer=writer)

第一行代码是调用animation.ImageMagickFileWriter()函数构造ImageMagick文件转换对象,它的定义如下:

class matplotlib.animation.ImageMagickWriter(fps=5, codec=None, bitrate=None, extra_args=None, metadata=None)

  • fps:表示帧速率, 默认值: 5

  • codec:表示使用编码器,可以是字符串或None, 默认: rcParams[“animation.codec”] (default: ‘h264’)

  • bitrate:表示位速率,kb/s,速率越高视频质量越好,但体积越来越大, 默认值: rcParams[“animation.bitrate”] (default: -1)

  • extra_args:表示命名行参数列表,可选。

  • metadata:表示GIF文件描述信息,字典对象描述Dict[str, str], default: {}

比如: title, artist, genre, subject, copyright, srcform, comment.

输出的结果如下:

Matplotlib 调用ImageMagick输出gif文件

其它代码与前面学习过的动画代码是一样的,就不再多解释了,整个例子的代码如下:

import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation 

plt.rcParams['animation.convert_path'] = r'D:\ImageMagick\magick.exe'

#
TWOPI = 2*np.pi
#
fig, ax = plt.subplots()

t = np.arange(0.0, TWOPI, 0.001)
s = np.sin(t)
l = plt.plot(t, s)

ax = plt.axis([0,TWOPI,-1,1])
#初始化
redDot, = plt.plot([0], [np.sin(0)], 'ro')

#动画回调函数
def animate(i):
    redDot.set_data(i, np.sin(i))
    return redDot,

# 使用animate函数
anim = animation.FuncAnimation(fig, animate, frames=np.arange(0.0, TWOPI, 0.1),
                               interval=10, blit=True, repeat=False)

# 
writer = animation.ImageMagickFileWriter(fps = 30)
anim.save('ani-057.gif', writer=writer)

plt.show()

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程