通过命令行启用/禁用图层

时间:2015-07-06 14:22:33

标签: svg inkscape

我有一个脚本(如下),它从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

2 个答案:

答案 0 :(得分:1)

我想出了一种方法,使用xmlstarlet来编辑InkScape SVG,然后再将其传递给InkScape本身。

想象一下,您有一个具有SenateBackgroundCaesarAntonius三层的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,现在需要采取的步骤...

  1. 阅读SVG / XML
    可以使用cat
  2. 将其插入xmlstarlet,以显示参议院背景
    在我的示例中,我处理每一层层,因此我没有任何层 诸如之类的限制修改SVG时,请记住显示/隐藏 在保存之前X / Y层,PNG生成脚本依赖于此!
  3. 再次将其插入xmlstarlet,显示凯撒(Caesar)
  4. 再次通过xmlstarlet将其插入,隐藏Antonius
  5. 将其放入InkScape,创建PNG
    您显然必须提供宽度/高度或DPI 不会从文件中存储的设置中获取。

命令:

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。