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 BytesIO
、import cairosvg
、from 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
,但您可以尝试svglib
,un幸运的是,不 似乎正在积极开发中:
【讨论】:
幸运的是,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 和基于矢量的图形的主要内容,如果未能解决你的问题,请参考以下文章