删除SVG文件中的转换

时间:2012-11-11 06:35:24

标签: svg transform inkscape

我一直在努力解决这个问题,似乎无法在任何地方找到答案(有效)。我有一个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中)。如果我手动删除变换,图像会拉到屏幕的另一部分(正如预期的那样),但我需要完全摆脱变换,同时让图像保持在我想要的位置。有没有办法将变换移除/压平到路径坐标本身? (我必须处理的唯一变换是平移和缩放,没有矩阵。)

26 个答案:

答案 0 :(得分:109)

如何在Inkscape中删除转换

  1. 在Inkscape中打开svg文件
  2. 转到修改 - &gt; XML编辑器
  3. 查找&#34;转换&#34;图层中的属性并删除它们
  4. 如何在不创建其他转换属性的情况下完全移动所有对象

    1. 转到修改 - &gt;选择所有图层中的全部
    2. 转到对象 - &gt;变换

      在“变换”面板中

    3. 取消选中相对移动并选中单独应用于每个对象

    4. 根据需要设置水平垂直值,然后点击应用
    5. 宾果

答案 1 :(得分:47)

我找出了问题所在。我希望不要诉诸罗伯特的答案,虽然我很高兴确认它会起作用!最后Duopixel的答案实际上是最接近的,尽管事实证明其他事情也在发生。

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

答案 2 :(得分:45)

enter image description here

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

答案 3 :(得分:21)

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

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

答案 4 :(得分:21)

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

安装完成后,您会在 Extensions&gt;下找到它。修改路径&gt;应用转换

信用:Inkscape论坛&gt; Remove all transforms whilst keeping in-place

答案 5 :(得分:13)

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

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

答案 6 :(得分:13)

Inkscape

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

通过这种方式,您将摆脱应用于该组的转换,它们将被转移到该组中包含的路径。

干杯

答案 7 :(得分:11)

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

打开SVG,文件 - &gt;出口 - &gt; SVG - &gt;更多 - &gt; 拼合变换效果很好。

Affinity Designer

答案 8 :(得分:9)

SVGO是一个出色的开源命令行工具,可用于此以及其他一些优化工具。它有一个同样出色的在线网络用户界面,名为SVGOMG

此案例中的相关选项为moveGroupAttrsToElems(SVGOMG:Move group attrs to elements),可将transform个属性从组移至路径元素,再加convertPathData(SVGOMG:{{1}将Round/rewrite paths展平为transform

答案 9 :(得分:7)

应该提到的是&#34;优化&#34;偏好中的模式:

Inkscape Preferences > Transforms > Store transformation > Optimized

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

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

根据a discussion,此优化模式缺乏热情的一个实例是页面调整大小。这会导致translate转换应用于图层<g>元素。似乎将儿童疏散到另一层是目前最好的解决方案。

答案 10 :(得分:6)

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

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

希望它有所帮助。

答案 11 :(得分:5)

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

由于示例中的所有术语都是相对的(即小写),所有这些术语都是相对的。如果有绝对(大写),例如M或C他们也必须调整。

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

答案 12 :(得分:4)

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

答案 13 :(得分:4)

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

答案 14 :(得分:4)

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

答案 15 :(得分:3)

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

答案 16 :(得分:3)

找到它:

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

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

答案 17 :(得分:2)

如果您使用的是Inkscape,这将起作用:

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

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

答案 18 :(得分:1)

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

答案 19 :(得分:1)

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

答案 20 :(得分:1)

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

File->Save as...->Optimized SVG.

答案 21 :(得分:0)

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

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

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

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

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

答案 22 :(得分:0)

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

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

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

答案 23 :(得分:0)

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

答案 24 :(得分:0)

不知怎的,我对任何一种方法都没有运气。如果您的svg中有<defs>部分,请使用以下内容:

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

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

答案 25 :(得分:0)

Kubuntu 20.04上的Inkscape 1.0

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

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

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

  • 第二,以上建议的解决方案都没有对我有用,但它们使我走上了正确的轨道。查理的答案接近了,但是 Object> Transform> Uncheck relative move> Apply 并没有显示出差异。

对我有用的是:

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

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


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