PIL 和基于矢量的图形

问题描述 投票:0回答:5

当我尝试使用 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。

我上传了两张图片:EPSSVG

python svg python-imaging-library vector-graphics eps
5个回答
14
投票

截至今天,即 2017 年 7 月,通过导入提供 svg2png 功能的 cairosvg 可以轻松完成 SVG 文件的读取和转换。

此外,svglib的开发又开始了,因此通过导入svglib和reportlab,从svg到png的转换应该也很容易。只需拨打 2 个电话即可。


8
投票

有 PIL 的替代品,但 PIL 的替代品不是你想要的 - 没有 据我所知,该库会透明地打开基于矢量的绘图并将其视为任何其他图像,无需打开网络浏览器并获取其渲染。

对于处理 SVG,有一个使用 Cairo 的方法 - 它也可以处理很多其他格式,如果比 PIL API 更难处理一点 - 我认为 Cairo 也可以处理 EPS - 所以,你可以开发您的应用程序使用 pycairo - 或者在最坏的情况下使用 pycairo + PIL。

渲染 SVG 的方法在以下问题的答案中:Convert SVG to PNG in Python

(请注意,您不必“将文件转换为 PNG” - 该配方显示了如何渲染到 cairo 表面,可以显示、保存到文件等)


1
投票

但是,Pillow 支持 EMF(增强型 Windows 图元文件),它仍然是矢量图形。当我正在寻找将 SVG 转换为 EMF 的便捷方法时,我偶然发现了这个线程。 最好的选择是使用 Inkscape 从 SVG 创建 EMF:

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


0
投票

虽然我相信最上面的答案更好,但可以利用 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
)

© www.soinside.com 2019 - 2024. All rights reserved.