206

我已经为此苦苦挣扎了一段时间,似乎无法在任何地方找到答案(有效)。我有一个如下所示的 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 中)。如果我手动删除转换,图像会压缩到屏幕的另一部分(如预期的那样),但我需要完全摆脱转换,同时让图像保持在我想要的位置。有没有办法将变换删除/展平为路径坐标本身?(我必须处理的唯一转换是平移和缩放,没有矩阵。)

4

26 回答 26

198

如何在 Inkscape中删除变换

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

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

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

在变换面板中

  1. 取消选中相对移动并选中分别应用于每个对象
  2. 根据您的需要设置水平垂直值,然后单击应用
于 2014-06-12T08:43:16.383 回答
67

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

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


学分:Inkscape 论坛 >删除所有变换,同时保持原位

于 2016-12-21T08:57:37.290 回答
58

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

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

于 2012-11-18T08:50:13.563 回答
57

在此处输入图像描述

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

在Inkscape上打开你的 svg :

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

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

于 2017-05-17T10:06:10.693 回答
24

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

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

于 2014-08-01T14:23:12.337 回答
18

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

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

于 2017-11-20T16:52:05.733 回答
16

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

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

亲和设计师

于 2015-10-13T11:05:04.247 回答
15

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

所以,你可以简单地选择路径(确保它是路径而不是周围的组),点击左右光标键,你就完成了。

于 2012-11-11T22:04:52.610 回答
9

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

Inkscape Preferences > Transforms > Store transformation > Optimized

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

无论如何,这似乎是默认开启的。

根据讨论,这种优化模式缺乏热情的一个例子是在调整页面大小时。这会导致将translate变换应用于图层<g>元素。看来,将孩子们疏散到另一层是目前最好的解决方案。

于 2015-03-10T14:45:18.693 回答
8

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

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

于 2013-07-11T12:55:41.723 回答
7
  1. 选择有问题的元素
  2. 对象 > 取消组合(重复直到所有内容都取消组合;查看嵌套节点的 XML 编辑器)
  3. 路径 > 对象到路径(将多边形转换为路径)
  4. 对象>变换>取消选中相对移动>应用
于 2016-02-18T19:00:57.477 回答
6

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

于 2014-10-17T15:08:47.500 回答
6

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

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

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

于 2012-11-11T13:56:12.543 回答
4

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

于 2015-03-06T15:28:50.690 回答
4

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

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

于 2019-01-20T12:05:51.043 回答
3

找到了:

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

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

于 2014-08-15T20:39:31.613 回答
3

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

于 2016-05-28T20:13:19.903 回答
2

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

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

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

于 2020-02-05T20:22:17.347 回答
1

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

于 2014-01-24T14:36:29.737 回答
1

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

Inkscape 论坛的用户Mc给了我这个解决方案

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

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

最后,我实际上可以拥有一个平移 SVG 视口。

于 2016-05-02T14:06:16.083 回答
1

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

于 2017-10-27T02:24:59.647 回答
1

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

于 2016-11-29T22:20:03.653 回答
1

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

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

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

不知何故,我对任何一种方法都没有运气。如果<defs>您的 svg 中有这样的部分和用法:

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

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

于 2018-06-05T12:18:08.700 回答
0

Kubuntu 20.04 上的 Inkscape 1.0

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

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

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

  • 其次,上面建议的解决方案都没有对我有用,但它们让我走上了正确的轨道。查理的答案很接近,但对象 > 变换 > 取消选中相对移动 > 应用确实没有区别。

对我有用的是:

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

当我在 FreeCAD 中使用该模板时工作正常。


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

于 2020-07-03T12:01:56.773 回答