用Python/PIL读取SVG文件
我刚开始学Python,所以请多多包涵。
简单来说,我的脚本应该这样运行:
1) 加载一张图片,并将其分成红、绿、蓝三个颜色通道
2) 用一个已经保存为svg文件的路径标记这张图片的某个区域
3) 对这个区域的红、绿、蓝值进行一些计算。
(然后根据计算结果,将图片发送到文件夹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"
width="22.2222in" height="16.6667in"
viewBox="0 0 1600 1200">
<path id="Auswahl"
fill="none" stroke="black" stroke-width="1"
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
2 个回答
0
在命令行中输入 pip install svglib
,这样就可以安装 svglib 这个库了。这个库是用纯 Python 写的,可以用来读取和转换 SVG 格式的文件。如果你想了解更多,可以看看 svglib 的书籍或者文档。
3
你需要把SVG文件转换成位图,然后才能用PIL把它叠加到原始图像上,因为PIL不支持矢量图。
我之前做过一些研究,发现目前在Python中唯一支持这个功能的库是cairo(不过,也许最近几个月关于SVG转换工具的情况有所变化)。
另一种方法是把你的原始位图图像作为背景放到SVG图像上,但我觉得这样做听起来有点奇怪…… ;-)