使用 Python/PIL 读取 SVG 文件

Posted

技术标签:

【中文标题】使用 Python/PIL 读取 SVG 文件【英文标题】:Read SVG file with Python/PIL 【发布时间】:2011-04-05 17:40:44 【问题描述】:

我是 Python 新手,所以请耐心等待。 基本上我的脚本应该像这样运行:

1) 加载图像并将其拆分为 R、G、B 通道 2) 使用保存为 svg 文件的现有路径标记该图像的一个区域,然后 3) 对该区域的 R、G、B 值进行一些计算。 (进一步将图像发送到文件夹 A 或 B,具体取决于计算结果)

我已经完成了 1) 和 3) 的一部分,但我目前的问题是加载 svg 文件并将其应用到我的图像上。 该图像是使用鱼眼镜头拍摄的照片。我只想获取实际照片的 RGB 值 - 而不是黑色背景。我通过使用 GIMP(不是圆圈)绘制所需的路径来创建 svg 文件。

我的问题是: 如何使用 python 加载现有的 svg 文件(并将其作为路径读取)并将路径应用于图像?

我确信有一种简单的方法可以做到这一点,但我还没有找到。

任何提示和建议将不胜感激!


编辑:

svg 文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
             `"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">

<svg xmlns="http://www.w3.org/2000/svg"
      
     viewBox="0 0 1600 1200">
  <path id="Auswahl"
        fill="none" stroke="black" stroke-
        d="M 848.00,103.21
           C 848.00,103.21 861.00,103.96 861.00,103.96
             891.77,105.30 921.91,109.93 952.00,116.58
             988.30,124.59 1023.25,137.24 1057.00,152.69
             1210.78,223.11 1322.55,368.09 1353.61,534.00
             1358.02,557.54 1361.00,581.11 1362.04,605.00
             1362.04,605.00 1363.00,616.00 1363.00,616.00
             1363.00,616.00 1363.00,649.00 1363.00,649.00
             1363.00,649.00 1362.04,662.00 1362.04,662.00
             1360.12,705.99 1352.05,749.92 1338.98,792.00
             1289.63,950.77 1167.62,1077.58 1011.00,1133.31
             962.90,1150.42 911.98,1160.82 861.00,1163.04
             861.00,1163.04 848.00,1164.00 848.00,1164.00
             848.00,1164.00 815.00,1164.00 815.00,1164.00
             815.00,1164.00 804.00,1163.04 804.00,1163.04
             756.47,1160.97 709.15,1151.72 664.00,1136.67
             608.47,1118.16 556.55,1090.63 510.00,1055.12
             469.68,1024.36 434.97,988.81 404.88,948.00
             288.05,789.50 269.64,577.90 355.26,401.00
             418.58,270.18 535.32,170.13 674.00,127.02
             700.27,118.86 729.73,111.96 757.00,108.28
             757.00,108.28 795.00,104.17 795.00,104.17
             795.00,104.17 809.00,103.21 809.00,103.21
             809.00,103.21 848.00,103.21 848.00,103.21 Z" />
</svg>

以及图片的链接: http://img153.imageshack.us/img153/5330/skybig.jpg

【问题讨论】:

如果您可以共享示例图像和 svg 文件,则更容易理解您打算做什么。第三步你在做什么样的计算? 一个小更新:我还没有找到使用 PIL 但使用 GIMP 的方法 @seb 如果您找到了使用 GIMP 的方法,那就这样吧。您可以使用 Python 与 GIMP 交互,这样问题就解决了(为什么要坚持使用不能解决问题的工具?)。 【参考方案1】:

您必须将 SVG 文件光栅化为位图,然后您可以使用 PIL 将其叠加到原始图像上,因为它不支持矢量图像。

我前段时间做了一些研究,我发现在 python 下唯一支持此功能的库是 cairo(同样,也许过去几个月关于 SVG 光栅化工具的情况发生了变化)。

另一种方法(我认为这不符合您的要求)是将您的原始位图图像作为背景应用到 SVG 图像,但这听起来很令人毛骨悚然... ;-)

【讨论】:

如何将原始图像作为位图应用到 svg 中?【参考方案2】:

pip install svglib 在 cmd 中输入它会安装 svglib 用于读取和转换 SVG 的纯 Python 库 阅读 svglib 或 doc 的书

【讨论】:

以上是关于使用 Python/PIL 读取 SVG 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何读取和更改使用 html 或 xhtml 中的图像标签包含的 svg 文件中的元素? [复制]

保存时使用 Python PIL“质量”参数时,PNG 文件大小是不是应该保持静态?

python:PIL图像处理

SVG.js,从使用“use”导入的元素中删除/读取属性“transform”

Python PIL, Image生成验证图片

Python PIL - 寻找最近的颜色(四舍五入颜色)