了解解析SVG文件格式

6

首先,这里是 gist

在 gist 中的 Map.svg 是我正在使用的原始地图,是从维基共享资源中获得的。

现在,在原始 svg 中,德克萨斯州东海岸外有一个陆地。我使用 Inkscape 将其删除后,它以一种奇怪的新方式重新编写了路径。差异包含在 gist 中。

现在,这种新的路径编写方式破坏了我的解析器逻辑,我正在尝试理解发生了什么。我希望这里有人比我更了解 SVG 文件格式。我承认我没有完全阅读 SVG 标准规范,但我阅读的部分没有提到任何关于缺少命令或相对坐标的内容。不过,我可能看错了规范,也不确定。

据我理解,SVG 路径数据非常简单,就像这样:

(M,L,C)[point{n}] .... [Z] 然后重复 ad-nauseum

现在我想要理解的部分是,这个新的 Inkscape 已经写出了一些看起来像是相对坐标的东西,没有像 L 这样的命令,或者 L 被某种方式隐含了。我的直觉告诉我,这里发生的事情对某个人来说是显而易见的。值得一提的是,我的解析器是用 C 编写的。


2
大写的路径命令是全局的,小写的路径命令是相对的。 - robertc
1个回答

10

如果你在解析SVG,为什么不看一下SVG规范呢?

在给定的(x,y)坐标处开始一个新子路径。M(大写)表示后面将跟随绝对坐标; m(小写)表示后面将跟随相对坐标。如果moveto后跟多个坐标对,则随后的坐标对将被视为隐式lineto命令。

来自:http://www.w3.org/TR/2011/REC-SVG11-20110816/paths.html#PathDataMovetoCommands

你说过,

我理解的方式,SVG路径数据非常直截了当,类似于这样:(M,L,C)[point{n}] .... [Z]

我不知道你从哪里获取了那些信息。停止从那个来源获取你的信息。

我承认我没有阅读完整个SVG标准规范...

没有人会阅读整个规范。只关注你目前正在实现的部分。你也可以从SVG Tiny开始,现在就使用该子集。

路径语法是编写解析器时应该开始的地方。如果您无法阅读它,请购买一本编译器书籍。

路径语法:http://www.w3.org/TR/2011/REC-SVG11-20110816/paths.html#PathDataBNF


谢谢,现在我知道我正在查看正确的源材料。我认为隐式行是发生的关键。谢谢! - slf
我并不是想暗示我根本没有看规范,我只是想说可能是因为我错过了某些内容,因为我知道我错过了关于隐式行的部分。 - slf
@slf:W3C规范(以及其他规范)都是相当令人望而生畏的东西。在你能够熟练地浏览它们之前,需要一些时间来适应。 - Dietrich Epp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接