ChatGPT解决这个技术问题 Extra ChatGPT

移除 SVG 文件中的转换

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


C
Community

如何在 Inkscape 中删除变换

在 Inkscape 中打开 svg 文件 Go to Edit -> Select All Go to Object -> Ungroup Go to Edit -> XML Editor 在图层中查找“转换”属性并删除它们

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

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

在变换面板中

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


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

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

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

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


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

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

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


惊人的!谢谢!这正是它所做的。我刚刚删除了保留内部内容的组标签,保存了它,然后在inkscape中重新打开它。当然,图像在视图框(或其他名称)之外,但我只是设置了 x,y 并且它是固定的。多么痛苦。感谢您分享这一点!
就我而言,我已将此答案中的方法与 that answer 中的另一种方法相结合。
这应该被赞成并被置于首位。这优雅地解决了问题并为我工作。即使图形错位在画布之外,您也可以随时调整它的大小(编辑>调整页面大小以选择)
m
methodofaction

https://i.stack.imgur.com/PgQpe.png

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


没有对象 > 重定向路径。你指的是哪个版本?
@0__ 如果禁用此菜单项,则意味着您的路径仍在组内。再次取消分组。
在您的 svg 中有 transform="rotate" 之前完美运行。
T
TylerH

在 Inkscape 上打开你的 svg:

选择包含您想要摆脱的所有转换的组

按 CTRL + U(取消组合)

按 CTRL + G(再次分组)

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


U
UTF_or_Death

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

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


R
Rob Hogan

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

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


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

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

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

https://i.stack.imgur.com/Ppg1Q.png


在开源应用程序中使用付费应用程序很奇怪
T
Thomas W

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

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


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

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

Inkscape Preferences > Transforms > Store transformation > Optimized

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

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

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


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

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

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


但是,它会改变路径的轮廓,并减少复杂形状中的顶点数量。
这通常会使标记比转换之前更大。
C
Charlie

选择有问题的元素对象>取消组合(重复直到所有内容都取消组合;查看嵌套节点的XML编辑器)路径>对象到路径(将多边形转换为路径)对象>变换>取消选中相对移动>应用


在 Inkscape 0.91 中似乎不起作用。具有 transform 属性的 <g> 保持原样。另外,我的对象(就像这里的问题所示)已经是一条路径。
您可以粘贴指向您的 SVG 的链接吗?
R
Robert Longson

在这种情况下,只需将转换添加到每个孩子的 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 9.0 和 M 3.0 5.0 C 6..4 2..4你想转变为一条路吗?
@Anton 如果您有现有答案未涵盖的问题,请使用 ask question 按钮。由于可用的格式非常有限,因此很难在评论中提问和回答。
@RobertLongson 好吧,您确实涵盖了它。我只希望您详细说明“如果有任何绝对(大写),例如 M 或 C,它们也必须进行调整。”
m
mcnesium

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


J
Joel Worsham

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


T
TylerH

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

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


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

找到了:

设置您想要的页面大小*

如果您当前的图层有一个变换(使用 XML 编辑器检查,它是 SVG 元素下的顶级组)然后创建一个新图层并将所有对象移动到它

取消分组任何组(这可能不需要,YMMV)

选择所有对象并应用空变换(例如按 100% 100% 缩放,或右箭头 + 左箭头),同时进行存储变换:在首选项/变换中优化

如果您必须撤消任何组,您现在可以重新组合它们

将副本另存为优化的 SVG 并设置所需的数字精度

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


我需要“移动到另一层”的技巧,因为我想要下推的变换位于图层的 上。 Inkscape 的坐标系很烦人。
E
Emily L.

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


这也是我发现的唯一解决方案。结合新的干净路径,然后删除不必要的部分。
M
Max888

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

选择所有内容并取消组合另存为“Optimized Svg (*.svg)”

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


S
Skadi2k3

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


C
Community

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


P
Peter

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

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

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


J
Jim

https://i.stack.imgur.com/eKaZW.png


V
Volomike

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

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

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

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

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


k
k102

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

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

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


M
Mr.Bum

Kubuntu 20.04 上的 Inkscape 1.0

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

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

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

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

对我有用的是:

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

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅