PIL与矢量图形
我在用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。
5 个回答
不过,Pillow支持EMF(增强型Windows图形文件),这仍然是矢量图形。我在寻找方便的方法将SVG转换为EMF时偶然发现了这个讨论。
你最好的选择是使用Inkscape来将SVG转换为EMF:
inkscape --file image.svg --export-emf image.emf
虽然有一些替代PIL的库,但这些替代品可能并不是你想要的。我不知道有哪个库能够像处理其他图片一样,轻松地打开矢量图形并进行处理,除了打开网页浏览器并获取它的渲染结果。
如果你想处理SVG格式,可以使用Cairo这个库。它不仅能处理SVG,还能处理很多其他格式,不过相对来说,使用起来比PIL要复杂一些。我觉得Cairo也能处理EPS格式,所以你可以考虑用pycairo来开发你的应用,或者在最坏的情况下,使用pycairo和PIL一起。
关于如何渲染SVG的具体方法,可以在这个链接的回答中找到:在Python中将SVG转换为PNG
(注意,你并不需要“把文件转换成PNG”——这个方法展示了如何渲染到Cairo的表面,这样你就可以显示出来、保存到文件等等。)
截至今天,也就是2017年7月,读取和转换SVG文件变得很简单,只需要导入cairosvg这个库,它提供了一个叫svg2png的功能。
此外,svglib的开发又重新开始了,所以只要导入svglib和reportlab,将SVG转换成PNG也应该很简单,只需要调用两次就可以了。