删除SVG文件中的转换


155

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



Answers:


149

如何在Inkscape中删除变换

  1. 在Inkscape中打开SVG文件
  2. 转到编辑-> XML编辑器
  3. 在图层中找到“变换”属性并将其删除

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

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

    在“变换”面板中

  3. 取消选中相对移动,然后选中分别应用于每个对象

  4. 根据需要设置水平垂直值,然后单击“ 应用”

16
为我工作。在对对象进行转换之前,需要先对其进行分组,以便更新路径的实际坐标。
Rupert Angermeier 2015年

8
嗯,将其设置为0并单击“应用”后,该变换再次显示在XML编辑器中。
2015年

7
取消分组对象对于此功能对我来说是必要的,谢谢!
张海

1
没为我工作。它将变平并将transform属性移到叶子上(实际上,所有内容在取消分组后都会变成叶子),但不会删除transform属性并应用于点几何,否则我将回到第一个正方形。
SzczepanHołyszewski17年

2
重要提示:就像上面解释的注释一样,您需要取消对象的分组才能正常工作,否则,transform属性将自动重新设置
Shadow

52

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

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


7
太棒了!谢谢!那正是它在做什么。我只是删除了组标签,保留了内部内容,将其保存,然后在inkscape中重新打开它。当然,图像在视图框之外(或其他任何视图),但是随后我只设置了x,y,并且它是固定的。真痛苦 感谢您分享这一点!
johntrepreneur

1
在我来说,我已经从合并这个答案与来自另外一个方法这个问题的答案
quasiyoke '16

应该对此予以推崇,并将其置于首位。这样可以很好地解决问题,并为我工作。即使将图形放错到画布之外,您也可以随时调整其大小(“编辑”>“调整页面大小以选择”)
普通话

48

在此处输入图片说明

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

1
没有对象>重定向路径。您指的是哪个版本?
2014年

1
@ 0__如果禁用此菜单项,则意味着您的路径仍在组中。再次取消分组。
methodofaction 2014年

37

有一个称为Apply Transforms的 inkscape扩展,可使用其变换重新计算路径。这正是我一直在寻找的东西。

安装后,您会在扩展>修改路径>应用转换下找到它的菜单。


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


此扩展程序已更新,现在至少在我的测试中也适用于rects。
sil

绝对。这个小插件为您提供的功能无法估量!
布雷特

23

对于组,重新组合可以快速完成工作。选择组,然后按Ctrl + Shift + G(取消组合),然后按Ctrl + G(组合)。

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


23

Inkscape上打开您的svg :

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

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


1
完善!这在Inkscape 1.0
中起作用

14

以我的经验,如果您使用Inkscape,只需稍微移动path元素即可(例如,使用光标键),Inkscape会删除transform属性并相应地调整路径数据。(令人讨厌的是,如果您实际上要保留transform属性。)

因此,您只需选择路径(确保它是路径而不是周围的组),然后单击左右光标键即可完成操作。


1
这对于<g>元素似乎不起作用。我正在尝试摆脱transform属性。
2013年

5
也许先尝试取消分组,然后再重新分组。
Thomas W

1
哇,魅力十足!这应该是公认的答案。无需额外的工具,无需复杂的步骤。如果路径嵌套在转换对象中,<g>而我想将转换对象保留在上,则其他答案无效<g>
tomekwi

也不适用于圆形工具创建的路径
sdaau

1
最好的答案。混乱的来源之一可能是“首选项”>“转换”>“存储转换”选项,我在这里没有看到其他选项。应将其设置为“优化”。然后,仅取消组合,移动,重新组合和不连续的变换即可。
Mr5o1'5

13

虽然我更喜欢Inkscape,但Affinity Designer(〜40美元/ Mac)在使用Android Vector Drawables时节省了我很多时间。

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

亲和力设计师


12

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

在这种情况下,相关选项包括moveGroupAttrsToElems(SVGOMG:)Move group attrs to elementstransform属性从组移动到路径元素,以及convertPathData(SVGOMG:)Round/rewrite paths展平transformd


1
SVGO令人难以置信。这确实应该是一个可以接受的答案,尤其是因为stackoverflow是出于程序员的角度考虑的,并且对于开发包含SVG的站点的程序员而言,这是迄今为止的最佳解决方案。将其放到部署管道中要比必须教您的艺术家手动删除转换(或必须自己完成)要
好得多,而

3
除非这不再起作用。我记得它曾经工作得更好,但是看到了关于SVGO的这个确切功能的问题github.com/svg/svgo/issues/624
morewry

9

应该提到的是,首选项中有“优化”模式:

Inkscape首选项>转换>商店转换>优化

应该尽量减少transform属性的出现(但不是)。

无论如何,这似乎默认情况下处于启用状态。

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


2
要调整页面大小而不translate在每一层上创建烦人的转换,请尝试.svg在文本编辑器中打开文件并操纵显示在顶部的height和width属性。
februaryInk 2015年

7

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

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


16
但是,它将改变路径的轮廓,并减少复杂形状的顶点数量。
查理

1
这通常会使标记比转换之前更大。
查理

6

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

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

对于小数位数,基本上可以将所有子值乘以小数位数。


我做到了,但是在Inkspace XML编辑器(或任何其他编辑器)中,仍然添加了转换。奇怪的。
2015年

1
如果您有2个子路径,例如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.3 6.4 5.0 7.0您想转变成一条道路吗?
设置

如果您有现有答案未涵盖的问题,则@Anton使用“ 问问题”按钮。由于可用的格式非常有限,因此很难在评论中提问和回答。
罗伯特·朗森

2
@RobertLongson很好,您确实涵盖了它。我只想请您详细说明“如果绝对(大写),例如M或C,它们也必须进行调整。”
设置

6
  1. 选择有问题的元素
  2. 对象>取消分组(重复操作,直到所有内容都解除分组;请参阅XML编辑器以了解嵌套节点)
  3. 路径>对象到路径(将多边形转换为路径)
  4. 对象>变换>取消选中相对移动>应用

在Inkscape 0.91中似乎不起作用。在<g>transform属性撑只是因为它是。另外,我的对象(就像这里的问题所示)已经是一条路径。
OR Mapper

您可以将链接粘贴到SVG吗?
查理

5

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



3

找到了:

  • 设置所需的页面尺寸*
  • 如果当前层具有转换(请使用XML编辑器检查,它是SVG元素下的顶部组),然后创建一个新层并将所有对象移至该层
  • 取消对任何组的分组(可能不需要,YMMV)
  • 选择所有对象并应用空转换(例如以100%100%缩放比例,或使用向右箭头+向左箭头):
  • 如果必须撤消任何组,现在可以将它们重新分组
  • 将副本另存为Optimized SVG并设置所需的数值精度

*:或至少将对象放置在相对于页面左上角所需的位置。不幸的是,SVG坐标参考了左上角,而Inkscape调整了页面相对于左下角的尺寸!


我需要“移至另一层”的技巧,因为我要下推的变换位于层的<g>上。Inkscape的坐标系很烦人。
突变鲍勃

3

matrix(...)通过将路径与矩形组合在一起,然后删除矩形的节点,可以摆脱转换(由于镜像)。该translate(...)部分虽然留下。


这也是我发现的唯一解决方案。结合新的清洁路径,然后删除不必要的部分。
马顿陶

2

就我而言,将其另存为优化的SVG可解决此问题。因此,在Inkscape中使用:

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


顺便说一句,您的问题是什么?我尽一切努力来到这里。但是问题仍然存在。
Sahu V Kumar,

@VishalKumarSahu由于以下原因,我无法将我的Android应用程序图标(SVG)导入为资产 transform属性不受Android Studio支持,。
12MichałStochmal

是的,在网络中也是如此。变换会在输出中产生问题,但在将对象作为一个整体进行布置时非常有帮助。我必须做一些计算才能解决目的。
Sahu V Kumar,

2

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

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

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


1

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


1

在我的情况下,组实际上是由层引起的。删除文档中的所有图层将删除组并进行转换(可能与取消组合对象并对其进行重新组合等操作,如在SVG文件删除转换一样(上述@Charlie的answer-35490189))


0

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

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

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

0

这似乎是随机的,但我尝试过的其他方法均无济于事,所以在这里您可以随意选择其他人。我的某些路径周围有一定的空白,只有在选择它们时才能看到(例)。我认为这是在我从另一个inkscape文件粘贴一个图层并将其旋转90度时创建的。这使得图案填充在形状上具有不同的变换(线条之间的距离更远)。这也使对齐对象无法按预期工作。使用@Piotr_cz提到的Apply Transform解决了转换问题,但是奇怪的余量仍然存在。通过将“笔触模糊”更改为任何值并将其更改回零,我意外地摆脱了它。


0

不知何故我对任何一种方法都不走运。如果<defs>您的svg中有部分内容,用法如下:

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

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


0

我已经遇到这个问题多年了。如果不将其固定在inkscape中,则解决方案显然是能够在浏览器中动态地进行转换。

Inkscape论坛上的用户Mc为我提供了此解决方案

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

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

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


0

Kubuntu 20.04上的Inkscape 1.0

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

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

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

  • 其次,以上建议的解决方案都没有对我有用,但它们使我走上了正确的轨道。查理的答案接近了,但是“ 对象”>“变换”>“取消相对移动”>“应用”没有显示任何区别。

对我有用的是:

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

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


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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.