我已经为此苦苦挣扎了一段时间,似乎无法在任何地方找到答案(有效)。我有一个如下所示的 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 中)。如果我手动删除变换,图像会压缩到屏幕的另一部分(如预期的那样),但我需要完全摆脱变换,同时让图像保持在我想要的位置。有没有办法将变换删除/展平为路径坐标本身? (我必须处理的唯一转换是平移和缩放,没有矩阵。)
如何在 Inkscape 中删除变换
在 Inkscape 中打开 svg 文件 Go to Edit -> Select All Go to Object -> Ungroup Go to Edit -> XML Editor 在图层中查找“转换”属性并删除它们
如何在不创建其他变换属性的情况下完全移动所有对象
转到编辑->在所有图层中全选转到对象->变换
在变换面板中
取消选中相对移动并选中分别应用于每个对象根据需要设置水平和垂直值,然后单击应用
有一个名为 Apply Transforms 的 inkscape 扩展程序,它使用它们的变换重新计算路径。这正是我一直在寻找的。
安装后,您会在 Extensions > Modify Path > Apply Transform 下找到它的菜单。
致谢:Inkscape 论坛 > Remove all transforms whilst keeping in-place
我弄清楚了问题所在。我希望不必求助于罗伯特的回答,尽管我很高兴确认它会起作用!最后 Duopixel 的答案实际上是最接近的,尽管事实证明还有其他事情发生。
当您在 Inkscape 文档中使用不同的路径时,我相信它的默认行为是将它们组合在一个 <svg:g.../>
标记下。当修改组中的路径时,Inkscape 会自动向组中添加一个变换来表示这些更改。但是,如果您打开 XML 编辑器并将路径拖到 <svg:g.../>
标记之外并使其成为自己的 <svg:path.../>
标记,Inkscape 可以随意编辑各个点。最后它确实是一个分组问题,即使我只使用一条路径!希望这可以帮助其他处于类似情况的人。
https://i.stack.imgur.com/PgQpe.png
在 Method Draw http://editor.method.ac 中加载您的 SVG(文件 > 打开图像)取消组合元素(对象 > 取消组合元素)您可能需要多次执行此操作。选择您的路径 重新定向路径(对象 > 重新定向路径)。保存图像(文件>保存图像)如果它出现在新窗口中,您可以右键单击并“将图像另存为...”
transform="rotate"
之前完美运行。
在 Inkscape 上打开你的 svg:
选择包含您想要摆脱的所有转换的组
按 CTRL + U(取消组合)
按 CTRL + G(再次分组)
这样,您将摆脱应用于组的变换,它们将被转移到该组中包含的路径。
对于团体来说,重组可以快速完成这项工作。选择组并按 Ctrl+Shift+G(解组),然后按 Ctrl+G(组)。
对于一些有类似问题的对象,例如螺旋和星星,快速的方法是按 Ctrl+Alt+C(描边到路径) - 但是这会将对象转换为纯路径并删除所有额外属性,比如sodipodi:cx, sodipodi:revolutions等等。
SVGO 是一个出色的开源命令行工具,可用于此和许多其他优化。有一个同样出色的在线网络用户界面,称为 SVGOMG
在这种情况下,相关选项是 moveGroupAttrsToElems
(SVGOMG: Move group attrs to elements
) 将 transform
属性从组移动到路径元素,加上 convertPathData
(SVGOMG: Round/rewrite paths
) 将 transform
扁平化为 d
。
虽然我更喜欢 Inkscape,但在使用 Android Vector Drawables 时,Affinity Designer(约 40 美元/Mac)为我节省了数小时的精力。
打开一个 SVG,文件 -> 导出 -> SVG -> 更多 -> 展平变换效果很好。
https://i.stack.imgur.com/Ppg1Q.png
根据我的经验,如果您使用 Inkscape,只需稍微移动路径元素(例如使用光标键),Inkscape 将删除变换属性并相应地调整路径数据。 (如果您真的想保留 transform 属性,那就很烦人了。)
所以,你可以简单地选择路径(确保它是路径而不是周围的组),点击左右光标键,你就完成了。
<g>
中并且我想将转换保留在 <g>
上,则其他答案不起作用。
值得一提的是,偏好中有“优化”模式:
Inkscape Preferences > Transforms > Store transformation > Optimized
这应该尽可能减少 transform
属性的出现,(但没有)。
无论如何,这似乎是默认开启的。
根据 a discussion,这种优化 模式缺乏热情的一个例子是当页面调整大小。这会导致将 translate
变换应用于层 <g>
元素。看来,将孩子们疏散到另一层是目前最好的解决方案。
translate
转换,请尝试在文本编辑器中打开 .svg
文件并操作显示在顶部的高度和宽度属性。
Inkscape 可以选择清除转换数据,但仍保持对象的值不变。
在 Inkscape 中,选择对象和“路径”菜单,“简化”。现在,您将删除转换。
选择有问题的元素对象>取消组合(重复直到所有内容都取消组合;查看嵌套节点的XML编辑器)路径>对象到路径(将多边形转换为路径)对象>变换>取消选中相对移动>应用
transform
属性的 <g>
保持原样。另外,我的对象(就像这里的问题所示)已经是一条路径。
在这种情况下,只需将转换添加到每个孩子的 m 值,因此 -10.254587 + 10.75 = -0.504587 和 -308.96875 + 345.43597 = 36.46722。
由于示例中的所有术语都是相对的(即小写),仅此而已。如果有任何是绝对的(大写),例如 M 或 C,它们也必须进行调整。
对于比例,您基本上将所有子值乘以比例。
要从 Inkscape 中的 g
元素(组)中删除 transform 属性,您可以将组移动到其最终位置,取消组合,然后重新组合所有元素。现在已经创建了一个新组,如果您不再移动它,它将不会获得附加的变换属性。
如果有人在这里寻找在 Sketch 3 中执行此操作的解决方案,请选择图层,然后单击图层->路径->展平。
在我的情况下,保存为优化的 SVG 解决了这个问题。所以在 Inkscape 中使用:
文件 -> 另存为... -> 优化的 SVG。
transform
属性,我无法将我的 android 应用程序图标 (SVG) 作为资产导入。
找到了:
设置您想要的页面大小*
如果您当前的图层有一个变换(使用 XML 编辑器检查,它是 SVG 元素下的顶级组)然后创建一个新图层并将所有对象移动到它
取消分组任何组(这可能不需要,YMMV)
选择所有对象并应用空变换(例如按 100% 100% 缩放,或右箭头 + 左箭头),同时进行存储变换:在首选项/变换中优化
如果您必须撤消任何组,您现在可以重新组合它们
将副本另存为优化的 SVG 并设置所需的数字精度
*:或者至少将对象放置在您需要它们的位置,相对于页面的左上角。不幸的是,SVG 坐标参考左上角,而 Inkscape 相对于左下角调整页面大小!
通过将路径与矩形组合,然后删除矩形的节点,我能够摆脱 matrix(...)
变换(由于镜像)。 translate(...)
部分仍然保留。
如果您使用的是 Inkscape,则此方法有效:
选择所有内容并取消组合另存为“Optimized Svg (*.svg)”
在我尝试过的所有情况下,这都删除了任何转换属性。不确定它是否适用于更复杂的 SVG。
我尝试了此处发布的解决方案,即删除 SVG 文件中的组标签并在 Inkscape 中重新打开它(在我的情况下为 0.48.3.1)。唉,在我使用选择和转换模式(F1)再次翻译路径并保存后,组标签再次出现! Inkscape 将应用于路径的所有转换保存在周围的组元素中。除非您使用路径节点选择工具 (F2),否则请按 ctrl+a 并将路径的节点移动到正确的位置。在我这样做并保存之后,Inkscape 没有添加组标签,因为这种翻译直接应用于路径模型。希望这可以帮助。
在我的情况下,这些组实际上是由层引起的。删除文档中的所有层删除了组和变换(可能与取消组合对象并重新组合它们等,如 Removing transforms in SVG files (来自上述@Charlie 的答案 35490189))
我的具体问题是在页面外定义的符号,因此需要在页面上显示转换。
要将符号移动到页面而不需要转换,我必须在 Inkscape 中完成以下步骤:
打开符号窗口 (Shift+Ctrl+Y) 从文档库中删除符号。 (窗口中有一个按钮。)现在图形显示在文档中,在页面边界之外。取消组合图形。 (这是至关重要的一步!)在页面边界内移动图形。将图形添加回符号库。
https://i.stack.imgur.com/eKaZW.png
我多年来一直有这个问题。解决方案显然是能够在浏览器中动态播放转换,如果它不会在inkscape中“固定”。
Inkscape 论坛的一位用户 Mc 给了我this solution。
该解决方案在 SVG 元素与其 SVG 根元素之间构建当前变换,然后根据变换的总数返回一整套 BBox 信息。
如果您想在浏览器中在同一个 SVG 文件的两个部分之间进行工作,也可以轻松更改计算相对于哪个元素。
最后,我实际上可以拥有一个平移 SVG 视口。
不知何故,我对任何一种方法都没有运气。如果您的 svg 中有 <defs>
部分,并且用法如下:
<g transform="matrix( *** ) "><use xlink:href="#***"/></g>
您可能必须删除所有用法并从 defs 部分中取出所有内容。然后,您可以使用 inkscape 以正确的方式放置所有内容,然后使用提到的插件应用转换。希望它可以帮助某人。
Kubuntu 20.04 上的 Inkscape 1.0
虽然这个线程相当老,但我想发布我的经验/解决方案。我在尝试为 FreeCAD 的 TechDrawing 工作台创建模板时遇到了这个问题。这些模板不得包含任何转换。
就我而言,我必须从外部 .svg 文件(完全用 Inkscape 制作)添加公司徽标。该徽标包含图形和文本元素。将该徽标复制到模板中时,会创建转换,导致模板在 FreeCAD 中无法正常工作。
首先,www.freecadweb.org/...上建议的这个解决方案对我不起作用。这就是我搜索网络并找到此讨论的原因。
其次,上面建议的解决方案都没有对我有用,但它们让我走上了正确的轨道。查理的答案很接近,但对象 > 变换 > 取消选中相对移动 > 应用确实没有区别。
对我有用的是:
正如其他人所提到的,取消组合所有内容。将文本对象转换为路径 - 在我的情况下这似乎是必不可少的!删除 xml-Editor 中的所有现有转换并观察相关对象发生的情况。在我的例子中,相应的元素改变了它们的位置。手动更正这些更改,但不要对任何内容进行分组。另存为普通 svg(普通 = 未使用优化或其他特殊设置)
当我在 FreeCAD 中使用该模板时工作正常。
一个奇怪的细节:虽然我的解决方案意味着文本元素是我的问题,但它并不是那么容易。事实上,基本文档(我复制徽标的那个)包含很多文本元素,我没有转换任何一个。所以它可能是“外部来源”和文本元素的组合。我只是将此细节发布给可能有相关问题的其他人的提示。
不定期副业成功案例分享