我有一个脚本(如下),它从svg文件导出到各种大小的png文件。这有效,但我需要更多。我需要能够在导出之前启用和禁用图层。 因此,例如,在# Android 行之后,我需要 启用图层 android 并禁用图层 ios
我该怎么做?
set -x
# Windows
INKSCAPE="/C/Program Files/Inkscape/inkscape.exe"
OPTS=--export-background-opacity=0
# Note that directories must already exist before exporting to them
SVG=My_Icon.svg
DEST=generated_icons
# Android
"$INKSCAPE" -w36 $OPTS --export-png=$DEST/android/ic_launcher-ldpi.png $SVG
"$INKSCAPE" -w48 $OPTS --export-png=$DEST/android/ic_launcher-mdpi.png $SVG
"$INKSCAPE" -w72 $OPTS --export-png=$DEST/android/ic_launcher-hdpi.png $SVG
"$INKSCAPE" -w96 $OPTS --export-png=$DEST/android/ic_launcher-xhdpi.png $SVG
"$INKSCAPE" -w144 $OPTS --export-png=$DEST/android/ic_launcher-xxhdpi.png $SVG
"$INKSCAPE" -w192 $OPTS --export-png=$DEST/android/ic_launcher-xxxhdpi.png $SVG
"$INKSCAPE" -w512 $OPTS --export-png=$DEST/android/ic_launcher-web.png $SVG
# iOS
"$INKSCAPE" -w57 $OPTS --export-png=$DEST/ios/ios_icon-57.png $SVG
"$INKSCAPE" -w72 $OPTS --export-png=$DEST/ios/ios_icon-72.png $SVG
"$INKSCAPE" -w114 $OPTS --export-png=$DEST/ios/ios_icon-57-2x.png $SVG
"$INKSCAPE" -w144 $OPTS --export-png=$DEST/ios/ios_icon-72-2x.png $SVG
答案 0 :(得分:1)
我想出了一种方法,使用xmlstarlet
来编辑InkScape SVG,然后再将其传递给InkScape本身。
想象一下,您有一个具有SenateBackground
,Caesar
和Antonius
三层的InkScape SVG,并且只需要组合(SenateBackground,Caesar)
和(SenateBackground,Antonius)
。 / p>
这是SVG中这种层的外观:
<g
inkscape:label="Caesar"
id="someID"
inkscape:groupmode="layer"
style="display:none"
sodipodi:insensitive="true"
transform="...">
请注意:在其他一些SO问题中,出现了使用inkscape --query-all <file> | grep "layer"
查询图层的技巧,至少在我的发现中,这是不可靠的,因为inkscape并不总是 < / em>将id="someID"
命名为id="layerX"
(grep
查找)。对我来说,某些层只是获得了g12345
之类的组ID。
要在参议院与凯撒一起生成PNG,现在需要采取的步骤...
cat
xmlstarlet
,以显示参议院背景xmlstarlet
,显示凯撒(Caesar)xmlstarlet
将其插入,隐藏Antonius 命令:
cat romanSenate.svg | \
xmlstarlet edit -P -S --update "//*[@inkscape:label='SenateBackground']/@style" -v "display:inline" | \
xmlstarlet edit -P -S --update "//*[@inkscape:label='Caesar']/@style" -v "display:inline" | \
xmlstarlet edit -P -S --update "//*[@inkscape:label='Antonius']/@style" -v "display:none" | \
inkscape -z -e romanSenate.svg.showingCaesar.png -d 300 /dev/stdin
-d 300
指定输出DPI。我们将/dev/stdin
用作输入文件,因为InkScape不会处理传递到它的任何内容。
答案 1 :(得分:0)
SVG只是一个XML,因此你可以设想一个以你想要的方式修改XML的工具,将有问题的层设置为in / visible。
也就是说,可能有更方便的选项:当通过CLI使用Inkscape进行转换时,您可以声明要导出的XML节点的ID以及不会呈现任何其他内容的标志。 / p>
来自Inkscape的手册页:
-i, - export-id
导出的区域将由命名对象的边界框定义。导出的图纸将包括部分 落在此边界框内的任何其他对象。一个名字 可以通过从Inkscape中选择对象来找到给定对象 并查看XML编辑器。 (当然,如果你这样做,你可能会这样做 使用“导出位图”对话框导出井。)
-j, - export-id-only
仅导出指定的对象。必须与--export-id选项一起使用。往上看。可以搭配使用 --export-area-canvas和--export-area-page。
为了正确参考,您可以在Inkscape中设置节点的ID。