如何管理 SVG 文件中超出范围的值?

Posted

技术标签:

【中文标题】如何管理 SVG 文件中超出范围的值?【英文标题】:How to manage the out of range values in a SVG file? 【发布时间】:2016-09-29 13:25:02 【问题描述】:

我目前正在编写一个 C++ 解析器来加载和绘制几个 SVG 文件。我使用 GDI+ 作为绘图库。这工作得很好,直到我发现一个显然包含一些不正确值的 SVG。这是 SVG 内容:

<svg xmlns="http://www.w3.org/2000/svg"   viewBox="0 0 64 64">
  <circle fill="#83BF4F" cx="32" cy="32" r="30"/>
  <path fill="#FFF" stroke="#FFF" stroke-miterlimit="10" d="M44.125 45.045c-1.4-1.076-2.914-3.112-3.215-5.043 3.275-4.105 5.716-9.195 4.947-14.506-.09-.629-.814-1.188-1.396-1.134-1.356.124-2.588.538-3.617 1.214v-3.93c0-.162-.025-.306-.06-.441-.349-3.004-2.514-5.039-5.39-5.198-1.627-.089-3.037.69-4.018 1.898-.978-1.114-2.363-1.809-3.982-1.898-1.621-.089-3.024.685-4.005 1.884a5.506 5.506 0 0 0-3.989-1.884c-1.869-.053-1.865 3.036 0 3.089 1.35.038 2.494 1.045 2.549 2.524 0 .009-.004.018-.004.026a95230194961536300000 95230194961536300000 0 0 1 2.904 21.948l-.005-21.862c.001-.029.007-.055.005-.086l-.001-.014c.194-3.301 4.923-3.295 5.097.014v21.948c0 1.991 2.898 1.991 2.898 0V21.646c.174-3.316 4.928-3.316 5.102 0v8.898a1.739 1.739 0 0 0 0 .368v8.046a38.165 38.165 0 0 1-3.576 3.543c-1.444 1.267.618 3.438 2.05 2.185a38.31 38.31 0 0 0 2.245-2.141c.855 2.069 2.368 3.913 3.998 5.165 1.52 1.17 2.963-1.512 1.463-2.665zm-1.08-17.262c.84 3.449-1.473 5.797-2.201 7.104v-4.343c.154-1.454 1.074-2.322 2.201-2.761z"/>
</svg>

如您所见,其中一条弧包含 95230194961536300000 的半径值。当我阅读此 SVG 时,我的引擎能够正确生成弧,尊重接收到的值,但结果完全是超现实的,GDI+ 没有完全喜欢。最后,只画了绿色的圆,GDI+完全忽略了路径,根本不画。

所以我有很多问题:

    这个值是多少?是否有限制,例如std::numeric_limits&lt;float&gt;::max()std::numeric_limits&lt;float&gt;::infinity() ? 这可能是 GDI+ 限制,例如不支持这样的值?如果是,GDI+ 支持的坐标的最大可能值是多少? 我注意到 Chrome 或 Firefox 等浏览器通过跳过不正确的路径部分来几乎正确地绘制此 SVG。他们是怎么做到的? 在解析 SVG 时捕获此类错误(如果确实是错误)的正确方法是什么?如果不是错误,应该如何解释这样的弧?

问候

【问题讨论】:

问题#1/#2:***.com/questions/3468495/… 对于问题 #3/#4:您需要自己解析 svg 并删除那些不正确的部分。作为解析示例,请看这里:***.com/questions/5115388/… 【参考方案1】:

首先,这些数字是疯狂且无用的。

老实说,我认为您的问题 #3 是关于如何回答 #4 的一个很好的提示。 #4 完全由您来决定是不想要输出还是只想要“给定奇怪的 SVG 输入,你能做到的最好的”。如果某些事情不正确对您来说总比没有好,除非正确,请加入 FireFox/Chrome 决策。

对我来说,我会根据如果您拒绝该 SVG 文件为坏文件会发生什么来决定,特别是因为制作它的人会指向 Chrome 并说“这个浏览器完美地显示它,为什么您的代码不起作用?”从技术上讲是不正确的,但在政治上可能是谨慎的,展示你能做的,记录缺陷,并做出合理的尝试来找出造成缺陷的原因。

祝你好运!

【讨论】:

其实这是我的问题。我已经决定展示我的能力,并尽可能赶上这些问题。但我需要确定的是如何做到这一点。为此,我需要决定如何处理这种情况,为此我需要更好地理解这个数字代表什么,它们是如何以及为什么生成的,以及我的图形库的限制是什么。这就是问题 #1 和 #2 背后的原因

以上是关于如何管理 SVG 文件中超出范围的值?的主要内容,如果未能解决你的问题,请参考以下文章

IndexError:列表索引在TensorFlow中超出范围

android 自定义View中滑动操作防止超出边界的简便方法

停止python对象在c ++中超出范围

为啥我收到错误 1264:第 1 行的“ping”列的值超出范围?

ComboBox 组件如何确定弹出窗口是不是需要超出控制范围?

如何使用 C++ 从 PCM 样本中过滤出超出听力范围的数据?