我目前正在编写一个c++解析器来加载和绘制几个SVG文件。我使用GDI +作为图形库。这很好,直到我发现一个SVG显然包含一些不正确的值。这是SVG内容:
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" 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<float>::max()
或std::numeric_limits<float>::infinity()
? 问候
最佳答案
首先,数字是疯狂和无用的。
老实说,我认为您的问题3是有关如何回答问题4的很好的提示。 #4完全由您决定是否不希望输出,或者只是“给定奇怪的SVG输入可以做的最好的事情”。如果不正确的事情总比没有好,否则对您总有好处,请加入FireFox/Chrome的决定。
对于我来说,我将根据如果您认为该SVG文件不正确而做出的决定,特别是因为生产该文件的人将指向Chrome,并说“此浏览器完美地显示了它,为什么您的代码无法正常工作?”从技术上讲是不正确的,但在政治上可能谨慎以显示您能做的事情,记录缺陷并做出合理的尝试来找出导致缺陷的原因。
祝好运!
关于c++ - 如何管理SVG文件中的超出范围的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39771606/