扁平化 SVG 嵌套转换的工具 [关闭]

Posted

技术标签:

【中文标题】扁平化 SVG 嵌套转换的工具 [关闭]【英文标题】:Tool to flatten SVG nested transformations [closed] 【发布时间】:2012-10-02 00:20:29 【问题描述】:

我想知道是否有任何命令行工具可用于通过 SVG 中的转换来展平嵌套组?

在我的特殊情况下,我将 CAD 软件生成的 PDF 转换为 SVG,然后添加一些元素并将修改后的 SVG 发布到网页以供查看。 SVG 的响应时间非常缓慢(对于平移和缩放),我发现这是由于 SVG 内部的嵌套组数量非常多,通常高达几百个深度。对于 SVG 中的每个元素,浏览器需要计算其所有父节点的位置...

显然这是荒谬的,因为所有这些元素都需要一个单一的转换(矩阵)。所以我想知道是否有人知道一个工具来扁平化它(或者一个可以这样做的 C# 或 Delphi 实现......)。

【问题讨论】:

你有没有找到合适的解决方案? @TomHall:除了 PStill,没有任何解决方案。我认为将许多折线(路径)转换为更简单的形状对于任何代码来说都可能过于复杂。 目前我发现的最佳选择是在将 Adob​​e PDF 保存为“优化的 PDF”(它是“丢弃对象”的一部分)时使用“拼合表单域”选项。这至少消除了嵌套,即使它不一定会减少对象的数量。 【参考方案1】:

我找到的最好的是 svgo https://github.com/svg/svgo 但还是不能令人满意。 SVGO 的目标是生成更小的 svg 文件。这意味着如果转换允许使用较小的 svg 文件,则它会被保留。我的目的类似于 OP,但略有不同。我正在寻找可以展平并完全将 SVG 简化为基本路径和元素的东西。

【讨论】:

jakearchibald.github.io/svgomg 建立在 svgo 上允许这样做 - 尝试转换 <svg xmlns="http://www.w3.org/2000/svg" width="137.34" height="350"> <g transform="rotate(90,267.715,566.295)"> <g transform="translate(1.42,-2.83)"> <path d="M -300,700 H 50" stroke="tomato" /> </g> </g> <g transform="translate(-10,2.64)"> <path d="m 10,201 h 90" stroke="lime" /> </g> </svg> 我得到了<svg xmlns="http://www.w3.org/2000/svg" width="137.34" height="350"> <path d="M137 0v350" stroke="tomato"/> <path d="M0 204h90" stroke="#0f0"/> </svg> ...这很可能通过命令行 SVGO。【参考方案2】:

你可以试试SVG Cleaner。不幸的是,它是一个 GUI 工具,因此它并不能真正满足您的要求,但它提供了一种可能变得有用的批处理理念。

【讨论】:

不幸的是,SVG 清理器并没有走那么远。我真的希望有一些现成的工具来平息所有这些废话,比如<g transform="matrix(0,1,-1,0,845.43,295.94)"> <g transform="translate(1.42,-2.83)"> <path d="m0,841.61h5.67"/> </g> <g transform="translate(1.42,2.27374E-013)"> <path d="m0,841.61h5.67" /> </g>...【参考方案3】:

感谢德拉普特,

同时我发现了这个:(PStill)。它在扁平化结构(PDF 到 PDF)方面做得非常好,但是生成的 SVG 中仍然有很多元素,这使得它对浏览器非常不可用。 CAD 系统生成 PDF 的真正麻烦是:许多非常小的路径而不是一条较长的路径。我很确定还有优化的空间......总有一天:-)

【讨论】:

【参考方案4】:

在 Inkscape 图形编辑器中有一个扁平化转换的选项。 因此,您可以使用 Inkscape 终端命令来实现它,但您必须查看是否存在这样的命令。

【讨论】:

据我所知,Inkscape 似乎完成了这项工作(至少在 GUI 中),但这是一个非常有限的功能:我需要选择所有对象,然后取消组合,然后重新选择它们并取消分组,然后重复,直到我确定没有其他组可以取消分组。每次都需要一定的处理时间,因此变得相当繁琐。

以上是关于扁平化 SVG 嵌套转换的工具 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jq 将此嵌套对象转换为扁平对象?

扁平化深度嵌套的 JSON 以获取 Dataframe 的最快和通用方法是啥?

数组扁平化

如何在 React 组件上放置未平面化的 svg 文件 [关闭]

大数据集上的扁平化+分区与嵌套记录

嵌套的json扁平化火花数据框