我正在使用matplotlib(在pylab中)显示图形。我想将它们保存为.jpg格式。当我简单地使用带有jpg扩展名的savefig命令时,会返回:
ValueError: Format "jpg" is not supported.
支持的格式:emf、eps、pdf、png、ps、raw、rgba、svg、svgz。
是否有一种方法可以执行此操作?
我正在使用matplotlib(在pylab中)显示图形。我想将它们保存为.jpg格式。当我简单地使用带有jpg扩展名的savefig命令时,会返回:
ValueError: Format "jpg" is not supported.
支持的格式:emf、eps、pdf、png、ps、raw、rgba、svg、svgz。
是否有一种方法可以执行此操作?
import Image
import matplotlib.pyplot as plt
plt.plot(range(10))
plt.savefig('testplot.png')
Image.open('testplot.png').save('testplot.jpg','JPEG')
原始图像:
JPEG图像:
为了澄清并更新@neo的有用答案和原始问题。一种简洁的解决方案是安装Pillow,它是Python Imaging Library(PIL)的更新版本。这可以通过以下方式实现
pip install pillow
一旦安装了Pillow,标准的Matplotlib命令
import matplotlib.pyplot as plt
plt.plot([1, 2])
plt.savefig('image.jpg')
将图形保存为JPEG文件,将不再产生ValueError错误。
与@amillerrhodes的回答相反,在Matplotlib 3.1版本中,仍不支持JPEG文件。如果我删除Pillow包,仍会收到有关不支持文件类型的ValueError错误。
只需使用 pip install pillow
安装pillow即可正常工作。
我刚刚在我的系统上将matplotlib更新到了1.1.0版本,现在它允许我使用savefig
保存为jpg格式。
要使用pip
升级到matplotlib 1.1.0,请使用以下命令:
pip install -U 'http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.1.0/matplotlib-1.1.0.tar.gz/download'
编辑(回复评论):
pylab
仅仅是matplotlib.pyplot和numpy命名空间(以及其他一些命名空间)的聚合,形成一个单独的命名空间。
在我的系统上,pylab
只是这样的:
from matplotlib.pylab import *
import matplotlib.pylab
__doc__ = matplotlib.pylab.__doc__
pylab
仅是你matplotlib安装中的另一个命名空间。因此,无论你使用pylab
还是matplotlib.pyplot
导入它都没有关系。如果您已经安装了PIL,Matplotlib可以直接透明地处理jpg格式的图片。您不需要调用它,它会自动完成。如果Python找不到PIL,则会引发错误。
我不确定所有Matplotlib版本,但在官方文档中,例如v3.5.0的savfig函数可以允许你传递设置到底层的Pillow库,该库实际上负责图像保存。因此,如果你需要一个具有特定压缩设置的jpg格式的图像:
import matplotlib.pyplot as plt
plt.plot(...) # Plot stuff
plt.savefig('filename.jpg', pil_kwargs={
'quality': 20,
'subsampling': 10
})
为了完整起见,如果您还想控制保存结果的质量(即压缩级别),似乎会变得更加复杂,因为直接传递plt.savefig(..., quality=5)
似乎对输出大小和质量没有影响。因此,一方面,可以先将结果保存为png,然后使用PIL
重新加载它,然后再次保存为jpeg,使用PIL
的quality
参数-类似于Yann答案中建议的内容。
另一方面,可以通过使用BytesIO
来避免这种加载和保存的偏差(按照this question的答案):
from io import BytesIO
import matplotlib.pyplot as plt
from PIL import Image
buf = BytesIO()
plt.plot(...) # Plot something here
plt.savefig(buf)
Image.open(buf).convert("RGB").save("testplot.jpg", quality=5)