读取PNG头部错误"运行时错误

1 投票
1 回答
3773 浏览
提问于 2025-04-18 11:58

有时候,我用 matplotlibcanvas.print_figure 来绘图时,会遇到一个我搞不懂的 RuntimeError 错误。要给出一个简单的运行示例对我来说太复杂了(尤其是我无法重现这个问题),不过我可以把调用的代码和错误追踪信息放在这里,希望有人能帮我找出问题所在。

这是函数调用的代码:

canvas.print_figure(filename, papertype='a4', orientation='landscape',
                    dpi=300, format='png')

这里的 canvas 是一个 FigureCanvas 实例,而 filename 是像 picture1110101.png 这样的文件名。

这是完整的错误追踪信息(我把长路径名用点替代了):

Traceback (most recent call last):
  File ".../draw.py", line 235, in plot
    _plot(*args[1:], **kwargs)
  File ".../draw.py", line 177, in _plot
    dpi=dpi, format=ftype)
  File ".../matplotlib/backend_bases.py", line 2093, in print_figure
    **kwargs)
  File ".../matplotlib/backends/backend_agg.py", line 491, in print_png
    FigureCanvasAgg.draw(self)
  File ".../matplotlib/backends/backend_agg.py", line 439, in draw
    self.figure.draw(self.renderer)
  File ".../matplotlib/artist.py", line 54, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File ".../matplotlib/figure.py", line 999, in draw
    func(*args)
  File ".../matplotlib/artist.py", line 54, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File ".../matplotlib/axes.py", line 2086, in draw
    a.draw(renderer)
  File ".../matplotlib/artist.py", line 54, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File ".../matplotlib/axis.py", line 1053, in draw
    tick.draw(renderer)
  File ".../matplotlib/artist.py", line 54, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File ".../matplotlib/axis.py", line 240, in draw
    self.label1.draw(renderer)
  File ".../matplotlib/artist.py", line 54, in draw_wrapper
    draw(artist, renderer, *args, **kwargs)
  File ".../matplotlib/text.py", line 576, in draw
    self._fontproperties, angle)
  File ".../matplotlib/backends/backend_agg.py", line 226, in draw_tex
    Z = texmanager.get_grey(s, size, self.dpi)
  File ".../matplotlib/texmanager.py", line 510, in get_grey
    X = read_png(os.path.join(self.texcache, pngfile))
RuntimeError: _image_module::readpng: error reading PNG header

看起来这个问题和 TeX 有关。我确实在使用 TeX,而且在包的初始化文件开头有以下配置行:

matplotlib.rc("text", usetex=True)

有没有什么提示呢?

1 个回答

2

这个问题是因为从 latex 转换到 dvi 再到 png 的过程中,生成了一个空的 png 文件。这个错误发生在 mpl 尝试读取这个 png 文件并把它放到画布上时,因为这个文件是空的,所以无法被识别为有效的 png 文件。

简单来说,mpl 在使用 Agg 后端把 latex 插入到你的图形中的步骤大概是这样的:

  1. 把你的 latex 字符串放进一个模板里。
  2. 调用 latex 来渲染这个模板,生成 dvi 文件。
  3. dvipng 把 dvi 转换成 png 文件。
  4. 再把这个 png 文件读回来,作为图像插入到你的图形中。

我建议你捕捉这个错误,然后再试一次。

撰写回答