【问题标题】:Removing transforms in SVG files移除 SVG 文件中的转换
【发布时间】:2012-10-31 00:22:25
【问题描述】:

我已经为此苦苦挣扎了一段时间,似乎无法在任何地方找到答案(有效)。我有一个如下所示的 SVG 文件:

<svg

   xmlns:dc="http://purl.org/dc/elements/1.1/"
   ...
   width="72.9375"
   height="58.21875"
   ...>
   ...
   <g
     ...
     transform="translate(10.75,-308.96875)"
     style="...">
     <path
       inkscape:connector-curvature="0"
       d="m -10.254587,345.43597 c 0,-1.41732 0.17692,-2.85384 0.5312502,-3.5625 0.70866,-1.41733 2.14518,-2.82259 3.5625,-3.53125 1.41733,-0.70866 2.11392,-0.70867 3.53125,0 1.41732,0.70866 ... z"
       ... />
  </g>
</svg>

我想删除 transform="..." 行,但我的图像仍保留在我放置的位置(在 InkScape 中)。如果我手动删除变换,图像会压缩到屏幕的另一部分(如预期的那样),但我需要完全摆脱变换,同时让图像保持在我想要的位置。有没有办法将变换删除/展平为路径坐标本身? (我必须处理的唯一转换是平移和缩放,没有矩阵。)

【问题讨论】:

标签: svg transform inkscape


【解决方案1】:

在这种情况下,只需将翻译添加到每个孩子的 m 值,因此 -10.254587 + 10.75 = -0.504587 和 -308.96875 + 345.43597 = 36.46722。

由于示例中的所有术语都是相对的(即小写),仅此而已。如果有的话是绝对的(大写),例如M 或 C 它们也必须进行调整。

对于比例,您基本上是将所有子值乘以比例。

【讨论】:

  • 我这样做了,但在 Inkspace XML 编辑器(或任何其他编辑器)中仍会添加转换。很奇怪。
  • 如果你有 2 个子路径,你会以哪种方式调整 C,例如M 8.0 12.0 C 11.3 13.1 14.9 13.55 16.0 13.0 C 2.4 9.8 2.8 10.2 8.0 12.0 C 7.6 7.8 7.6 8.1 5.0 9.0 和 M 3.0 5.0 C 2.4 5.5 3.0 3.0 6.4 5.0 7 要将哪条路径转换成一个路径?
  • @Anton 如果您有现有答案未涵盖的问题,请使用ask question 按钮。由于可用的格式非常有限,因此很难在 cmets 中提问和回答。
  • @RobertLongson 好吧,你确实报道了它。我只希望您详细说明“如果有绝对的(大写),例如 M 或 C,它们也必须进行调整。”
【解决方案2】:

  1. 在 Method Draw http://editor.method.ac 中加载您的 SVG(文件 > 打开图像)
  2. 您可能需要多次取消组合元素(对象 > 取消组合元素)。
  3. 选择您的路径
  4. 重定向路径(对象 > 重定向路径)。
  5. 保存您的图像(文件 > 保存图像)如果它出现在新窗口中,您可以右键单击并“将图像另存为...”

【讨论】:

  • 没有对象 > 重定向路径。你指的是哪个版本?
  • @0__ 如果禁用此菜单项,则意味着您的路径仍在组内。再次取消组合。
  • 完美运行,直到您的 svg 中有 transform="rotate"
【解决方案3】:

根据我的经验,如果您使用 Inkscape,只需稍微移动路径元素(例如使用光标键),Inkscape 将删除变换属性并相应地调整路径数据。 (如果您真的想保留 transform 属性,这很烦人。)

因此,您可以简单地选择路径(确保它是路径而不是周围的组),然后按左右光标键,就完成了。

【讨论】:

  • 这似乎不适用于 元素。我正在尝试摆脱 transform 属性。
  • 也许可以先尝试取消组合,然后再重新组合。
  • 哇,工作就像一个魅力!这应该是公认的答案。不需要额外的工具,没有复杂的步骤。如果路径嵌套在转换后的 &lt;g&gt; 中,其他答案将不起作用,并且我想将转换保留在 &lt;g&gt; 上。
  • 也不适用于圆形工具创建的路径
  • 最佳答案。可能造成混淆的原因之一是 Preferences > Transforms > Store Tranformations 选项,我在这里其他地方没有提到。它应该设置为“优化”。然后只需取消组合、移动、重新组合,然后删除无效变换。
【解决方案4】:

我找出了问题所在。我希望不必求助于罗伯特的回答,尽管我很高兴确认它会起作用!最后 Duopixel 的答案实际上是最接近的,尽管事实证明还有其他事情发生。

当您在 Inkscape 文档中使用不同的路径时,我相信它的默认行为是将它们组合在一个 &lt;svg:g.../&gt; 标记下。当修改组中的路径时,Inkscape 会自动向组中添加一个变换来表示这些更改。但是,如果您打开 XML 编辑器并将路径拖到 &lt;svg:g.../&gt; 标记之外并使其成为自己的 &lt;svg:path.../&gt; 标记,Inkscape 可以随意编辑各个点。最后它确实是一个分组问题,即使我只使用一条路径!希望这可以帮助其他处于类似情况的人。

【讨论】:

  • 太棒了!谢谢!这正是它所做的。我刚刚删除了保留内部内容的组标签,保存了它,然后在inkscape中重新打开它。当然,图像在视图框(或其他名称)之外,但我只是设置了 x,y 并且它是固定的。多么痛苦。感谢您分享这个!
  • 在我的情况下,我将这个答案中的方法与that answer中的另一种方法结合起来。
  • 这应该被投票并置顶。这优雅地解决了问题并为我工作。即使图形错位在画布之外,您也可以随时调整它的大小(编辑 > 调整页面大小以选择)
【解决方案5】:

Inkscape 可以选择清除转换数据,但仍不修改对象的值。

在 Inkscape 中,选择对象和“路径”菜单“简化”。 现在,您将删除转换。

【讨论】:

  • 不过,它会改变路径的轮廓,并减少复杂形状中的顶点数量。
  • 这通常会使标记比转换前更大。
【解决方案6】:

我尝试了此处发布的解决方案,即删除 SVG 文件中的组标签并在 Inkscape 中重新打开它(在我的情况下为 0.48.3.1)。唉,在我使用选择和转换模式(F1)再次翻译路径并保存后,组标签再次出现! Inkscape 将应用于路径的所有转换保存在周围的组元素中。除非您使用路径节点选择工具 (F2),否则请按 ctrl+a 并将路径的节点移动到正确的位置。在我这样做并保存之后,Inkscape 没有添加组标签,因为这种翻译直接应用于路径模型。希望这会有所帮助。

【讨论】:

    【解决方案7】:

    如何在 Inkscape 中删除 变换

    1. 在 Inkscape 中打开 svg 文件
    2. 转到编辑 -> 全选
    3. 转到对象 -> 取消组合
    4. 转到编辑 -> XML 编辑器
    5. 在图层中找到“变换”属性并删除它们

    如何在不创建其他变换属性的情况下完全移动所有对象

    1. 转到编辑 -> 在所有图层中全选
    2. 转到对象 -> 变换

    在变换面板中

    1. 取消选中相对移动并选中分别应用于每个对象
    2. 根据需要设置水平垂直值,然后点击应用

    【讨论】:

    • 为我工作。对象在转换之前需要取消分组,以便更新路径的实际坐标。
    • 嗯,在将其设置为 0 并单击应用后,转换再次显示在 XML 编辑器中。
    • 取消组合对象对于我来说是必要的,谢谢!
    • 对我不起作用。它将展平并将变换属性移动到叶子(实际上在取消分组后一切都变成了叶子),但它不会删除变换属性并将其应用于点几何,没有它我又回到了第一格。
    • 重要提示:就像上面解释的评论一样,您需要取消组合对象才能正常工作,否则将自动重新设置变换属性
    【解决方案8】:

    对于团体来说,重组可以快速完成这项工作。选择组并按 Ctrl+Shift+G(解组),然后按 Ctrl+G(组)。

    对于一些有类似问题的对象,例如螺旋和星星,快速的方法是按 Ctrl+Alt+C(描边到路径) - 但是这会将对象转换为纯路径并删除所有额外的-属性,例如sodipodi:cx、sodipodi:revolutions等。

    【讨论】:

      【解决方案9】:

      找到了:

      • 设置所需的页面大小*
      • 如果您当前的图层有一个变换(使用 XML 编辑器检查,它是 SVG 元素下的顶层组)然后创建一个新图层并将所有对象移动到它
      • 取消分组任何组(这可能不需要,YMMV)
      • 选择所有对象并应用空变换(例如按 100% 100% 缩放,或右箭头 + 左箭头),同时进行存储变换:在首选项/变换中优化
      • 如果您必须撤消任何组,现在可以重新组合它们
      • 将副本另存为优化的 SVG 并设置所需的数值精度

      *:或者至少将对象放置在您需要它们的位置,相对于页面的左上角。不幸的是 SVG 坐标参考左上角,而 Inkscape 相对于左下角调整页面大小!

      【讨论】:

      • 我需要“移动到另一层”的技巧,因为我想要下推的变换位于层的 上。 Inkscape 的坐标系很烦人。
      【解决方案10】:

      要从 Inkscape 中的 g 元素(组)中删除 transform 属性,您可以将组移动到其最终位置,取消组合,然后重新组合所有元素。现在已经创建了一个新组,如果您不再移动它,它将不会获得附加的变换属性。

      【讨论】:

        【解决方案11】:

        如果有人在这里寻找在 Sketch 3 中执行此操作的解决方案,请选择图层,然后单击图层->路径->展平。

        【讨论】:

          【解决方案12】:

          值得一提的是,偏好中有“优化”模式:

          Inkscape 首选项 > 转换 > 存储转换 > 优化

          这应该尽可能减少transform 属性的出现,(但没有)。

          这似乎是默认开启的。

          根据a discussion,这种优化 模式缺乏热情的一个例子是当页面被调整大小。这会导致translate 变换应用于层&lt;g&gt; 元素。看来,将孩子们疏散到另一层是目前最好的解决方案。

          【讨论】:

          • 要调整页面大小而不在每一层上创建烦人的translate 转换,请尝试在文本编辑器中打开.svg 文件并操作显示在顶部的高度和宽度属性。
          【解决方案13】:

          虽然我更喜欢 Inkscape,但在使用 Android Vector Drawables 时,Affinity Designer(约 40 美元/Mac)为我节省了数小时的精力。

          打开一个 SVG,文件 -> 导出 -> SVG -> 更多 -> 扁平化变换 效果很好。

          【讨论】:

          • 在开源应用中使用付费应用很奇怪
          【解决方案14】:
          1. 选择有问题的元素
          2. 对象 > 取消分组(重复直到所有内容都取消分组;查看嵌套节点的 XML 编辑器)
          3. 路径 > 对象到路径(将多边形转换为路径)
          4. 对象 > 变换 > 取消选中相对移动 > 应用

          【讨论】:

          • 似乎在 Inkscape 0.91 中不起作用。带有transform 属性的&lt;g&gt; 保持原样。另外,我的对象(就像这里的问题所示)已经是一条路径。
          • 你能粘贴一个链接到你的 SVG 吗?
          【解决方案15】:

          我多年来一直有这个问题。解决方案显然是能够在浏览器中动态播放转换,如果它不会在inkscape中“修复”。

          Inkscape 论坛的用户 Mc 给了我this solution

          该解决方案在 SVG 元素与其 SVG 根元素之间构建当前变换,然后根据变换的总数返回一整套 BBox 信息。

          如果您想在浏览器中在同一个 SVG 文件的两个部分之间进行工作,也可以轻松更改计算相对于哪个元素。

          我终于可以拥有一个平移 SVG 视口了。

          【讨论】:

            【解决方案16】:

            通过将路径与矩形组合,然后删除矩形的节点,我能够摆脱 matrix(...) 变换(由于镜像)。 translate(...) 部分仍然保留。

            【讨论】:

            • 这也是我找到的唯一解决方案。结合新的干净路径,然后删除不必要的部分。
            【解决方案17】:

            在我的情况下,这些组实际上是由层引起的。删除文档中的所有图层删除了组和变换(可能与取消组合对象并重新组合它们等,如Removing transforms in SVG files(来自上述@Charlie 的答案-35490189))

            【讨论】:

              【解决方案18】:

              有一个名为 Apply Transforms 的 inkscape 扩展,它使用它们的变换重新计算路径。这正是我一直在寻找的。​​p>

              安装后,您会在 Extensions > Modify Path > Apply Transform 下找到它的菜单。


              致谢:Inkscape 论坛 > Remove all transforms whilst keeping in-place

              【讨论】:

              • 这个扩展已经更新,现在它也适用于矩形,至少在我的测试中。
              • 当然。这个小插件给你的力量是无法估量的!
              • 创造奇迹! * 将组移动到您想要的位置, * 打破组 (ctrl + u) * 扩展 > 修改路径 > 应用变换 * 保存 就是这样。 :)
              • 在 Inkscape 1.0.2 下惨遭失败。
              • 不幸的是,这个扩展无法处理一些可能的速记符号,尤其是使用句点字符作为分隔符...
              【解决方案19】:

              Inkscape 上打开您的 svg:

              • 选择包含您要删除的所有转换的组
              • CTRL + U(取消组合)
              • CTRL + G(再次分组)

              这样您将摆脱应用于组的变换,它们将被转移到该组中包含的路径。

              【讨论】:

                【解决方案20】:

                我的具体问题是在页面外定义的符号,因此需要在页面上显示转换。

                要将符号移动到页面而不需要转换,我必须在 Inkscape 中完成以下步骤:

                1. 打开符号窗口 (Shift+Ctrl+Y)
                2. 从文档库中删除符号。 (窗口中有一个按钮。)
                3. 现在图形显示在文档中,位于页面边界之外。
                4. 取消图形组合。 (这是至关重要的一步!)
                5. 在页面边界内移动图形。
                6. 将图形添加回符号库。

                【讨论】:

                  【解决方案21】:

                  这似乎是随机的,但我尝试过的其他方法都没有,所以在这里你随机选择其他人。我的一些路径周围有一种边缘,只有在选择它们时才能看到 ()。我认为这是当我从另一个 inkscape 文件中粘贴一个图层并将其旋转 90 度时创建的。这使得形状上的图案填充具有不同的变换(线间隔更远)。它还使对齐对象无法按预期工作。使用@Piotr_cz 提到的Apply Transform 解决了转换问题,但奇怪的边距仍然存在。我不小心通过将描边模糊更改为任何值并将其更改回零来摆脱它。

                  【讨论】:

                    【解决方案22】:

                    SVGO 是一个出色的开源命令行工具,可用于此和许多其他优化。还有一个同样出色的在线 Web UI,称为 SVGOMG

                    这种情况下的相关选项是moveGroupAttrsToElems(SVGOMG:Move group attrs to elements)将transform属性从组移动到路径元素,加上convertPathData(SVGOMG:Round/rewrite paths)将transform扁平化为@ 987654330@.

                    【讨论】:

                    • SVGO 令人难以置信。这确实应该是公认的答案,特别是因为 stackoverflow 是针对程序员的观点,而对于开发包含 SVG 的站点的程序员来说,这是迄今为止最好的解决方案。将其放入您的部署管道比必须教您的艺术家手动删除转换(或必须自己做)并在他们每次忘记时获取错误报告要好得多
                    • 除非这不再起作用。我记得它曾经工作得更好,但看到这个关于这个确切功能的问题github.com/svg/svgo/issues/624 for SVGO
                    【解决方案23】:

                    不知何故,我对任何方法都没有运气。如果您的 svg 中有 &lt;defs&gt; 部分,并且用法如下:

                    <g transform="matrix( *** ) "><use xlink:href="#***"/></g>
                    

                    您可能必须删除所有用法并从 defs 部分中取出所有内容。然后,您可以使用 inkscape 以正确的方式放置所有内容,然后使用提到的插件应用转换。 希望它可以帮助某人。

                    【讨论】:

                      【解决方案24】:

                      在我的情况下,保存为优化的 SVG 解决了这个问题。所以在 Inkscape 中使用:

                      文件 -> 另存为... -> 优化的 SVG。

                      【讨论】:

                      • 顺便说一句,您的问题是什么?我在尝试了一切之后来到这里。但问题依然存在。
                      • @VishalKumarSahu 由于 Android Studio 不支持 transform 属性,我无法将我的 android 应用程序图标 (SVG) 作为资产导入。
                      • 是的,在网络上也是如此。变换会在输出中产生问题,但在对象作为一个组排列时非常有用。我必须做计算来解决这个目的。
                      【解决方案25】:

                      如果您使用的是 Inkscape,则此方法有效:

                      1. 选择所有内容并取消组合
                      2. 另存为“优化的 Svg (*.svg)”

                      在我尝试过的所有情况下,这都删除了所有转换属性。不确定它是否适用于更复杂的 SVG。

                      【讨论】:

                        【解决方案26】:

                        Kubuntu 20.04 上的 Inkscape 1.0

                        虽然这个帖子比较老,但我想发布我的经验/解决方案。我在尝试为 FreeCAD 的 TechDrawing 工作台创建模板时遇到了这个问题。这些模板不得包含任何转换。

                        就我而言,我必须从外部 .svg 文件(完全使用 Inkscape 制作)添加公司徽标。该徽标包含图形和文本元素。将该徽标复制到模板中时,会创建转换,导致模板在 FreeCAD 中无法正常工作。

                        • 首先,www.freecadweb.org/... 上建议的这个解决方案对我不起作用。这就是我搜索网络并找到此讨论的原因。

                        • 其次,上面建议的解决方案都没有对我有用,但它们让我走上了正轨。 Charlie 的回答很接近,但 Object > Transform > Uncheck relative move > Apply 确实没有区别。

                        对我有用的是:

                        1. 正如其他人所说,取消组合所有内容。
                        2. 将文本对象转换为路径 - 这对我来说似乎是必不可少的!
                        3. 删除 xml-Editor 中的所有现有转换并观察相关对象发生的情况。在我的例子中,相应的元素改变了它们的位置。
                        4. 手动更正这些更改,但不要对任何内容进行分组。
                        5. 另存为普通 svg(普通 = 未使用优化或其他特殊设置)

                        当我在 FreeCAD 中使用该模板时效果很好。


                        一个奇怪的细节: 尽管我的解决方案表明文本元素是我的问题,但这并不容易。事实上,基础文档(我复制徽标的那个)包含很多文本元素,而我没有转换任何一个。所以它可能是“外部来源”文本元素的组合。我只是将此细节发布给可能有相关问题的其他人的提示。

                        【讨论】:

                          猜你喜欢
                          • 2018-10-02
                          • 2020-09-21
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2016-03-18
                          相关资源
                          最近更新 更多