当我尝试使用 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。
截至今天,即 2017 年 7 月,通过导入提供 svg2png 功能的 cairosvg 可以轻松完成 SVG 文件的读取和转换。
此外,svglib的开发又开始了,因此通过导入svglib和reportlab,从svg到png的转换应该也很容易。只需拨打 2 个电话即可。
有 PIL 的替代品,但 PIL 的替代品不是你想要的 - 没有 据我所知,该库会透明地打开基于矢量的绘图并将其视为任何其他图像,无需打开网络浏览器并获取其渲染。
对于处理 SVG,有一个使用 Cairo 的方法 - 它也可以处理很多其他格式,如果比 PIL API 更难处理一点 - 我认为 Cairo 也可以处理 EPS - 所以,你可以开发您的应用程序使用 pycairo - 或者在最坏的情况下使用 pycairo + PIL。
渲染 SVG 的方法在以下问题的答案中:Convert SVG to PNG in Python
(请注意,您不必“将文件转换为 PNG” - 该配方显示了如何渲染到 cairo 表面,可以显示、保存到文件等)
但是,Pillow 支持 EMF(增强型 Windows 图元文件),它仍然是矢量图形。当我正在寻找将 SVG 转换为 EMF 的便捷方法时,我偶然发现了这个线程。 最好的选择是使用 Inkscape 从 SVG 创建 EMF:
inkscape --file image.svg --export-emf image.emf
虽然我相信最上面的答案更好,但可以利用 Inkscape 将 SVG 渲染为 PNG 文件。
render_image_command = "inkscape --export-background-opacity=0 --export-width={} --export-type=png --export-filename {} {}"
render_image_command = render_image_command.format(
image_width_in_pixels,
path_to_png_image_to_write,
path_to_svg_image_to_read
)