PIL 和基于矢量的图形

Posted

技术标签:

【中文标题】PIL 和基于矢量的图形【英文标题】:PIL and vectorbased graphics 【发布时间】:2013-02-14 08:33:45 【问题描述】:

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

【问题讨论】:

PIL 不支持 SVG 格式。不完全支持 EPS 格式。见pythonware.com/library/pil/handbook/index.htm。 那么,在 python 世界中,PIL 有什么替代品吗? 【参考方案1】:

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

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

【讨论】:

要添加这个答案,只需三个命令(加上导入):在from io import BytesIOimport cairosvgfrom PIL import Image 之后,只需运行out = BytesIO()cairosvg.svg2png(url='path/to/svg', write_to=out)image = Image.open(out) 经过大量搜索,我发现 svglib 和 reportlab 是最好的选择!使用 pip 安装,调用并且它刚刚工作 - 可爱!谢谢!【参考方案2】:

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

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

渲染 SVG 的秘诀在于:Convert SVG to PNG in Python

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

PIL 不支持svg,但您可以尝试svglibun幸运的是, 似乎正在积极开发中:

https://pypi.python.org/pypi/svglib/ https://github.com/deeplook/svglib

【讨论】:

幸运的是,svglib 开发现在似乎又回来了。目前 PyPI 中的 0.8.1 版本支持 Python 2.7 和 3.5。【参考方案5】:

虽然我认为最佳答案更好,但可以利用 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
)

【讨论】:

以上是关于PIL 和基于矢量的图形的主要内容,如果未能解决你的问题,请参考以下文章

SVG可缩放矢量图形

SVG(可缩放矢量图形)

svg简介与使用

SVG基本形状及样式设置

svg --- 可缩放矢量图形

矢量图形SVG&高级动画