PIL与矢量图形

25 投票
5 回答
58585 浏览
提问于 2025-04-17 17:25

我在用PIL打开EPS或SVG格式的图片时遇到了几个问题。

打开EPS格式的图片时,

from PIL import Image
test = Image.open('test.eps')

结果是:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\Lib\site-packages\PIL\Image.py", line 1965, in open
    return factory(fp, filename)
  File "C:\Python27\Lib\site-packages\PIL\ImageFile.py", line 91, in __init__
    self._open()
  File "C:\Python27\Lib\site-packages\PIL\EpsImagePlugin.py", line 206, in _open
    raise IOError, "bad EPS header"
  IOError: bad EPS header

而打开SVG格式的图片时也出现了 IOError: cannot identify image file 的错误。

问题是我需要在我的应用程序中支持这两种格式。转换成其他格式并不是一个可行的解决办法。我使用的是Windows 7,Python 2.7.2和PIL 1.1.7。

我上传了这两张图片: EPS格式SVG格式

5 个回答

1

不过,Pillow支持EMF(增强型Windows图形文件),这仍然是矢量图形。我在寻找方便的方法将SVG转换为EMF时偶然发现了这个讨论。

你最好的选择是使用Inkscape来将SVG转换为EMF:

inkscape --file image.svg --export-emf image.emf

8

虽然有一些替代PIL的库,但这些替代品可能并不是你想要的。我不知道有哪个库能够像处理其他图片一样,轻松地打开矢量图形并进行处理,除了打开网页浏览器并获取它的渲染结果。

如果你想处理SVG格式,可以使用Cairo这个库。它不仅能处理SVG,还能处理很多其他格式,不过相对来说,使用起来比PIL要复杂一些。我觉得Cairo也能处理EPS格式,所以你可以考虑用pycairo来开发你的应用,或者在最坏的情况下,使用pycairo和PIL一起。

关于如何渲染SVG的具体方法,可以在这个链接的回答中找到:在Python中将SVG转换为PNG

(注意,你并不需要“把文件转换成PNG”——这个方法展示了如何渲染到Cairo的表面,这样你就可以显示出来、保存到文件等等。)

15

截至今天,也就是2017年7月,读取和转换SVG文件变得很简单,只需要导入cairosvg这个库,它提供了一个叫svg2png的功能。

此外,svglib的开发又重新开始了,所以只要导入svglib和reportlab,将SVG转换成PNG也应该很简单,只需要调用两次就可以了。

撰写回答