Gibt es eine Möglichkeit, SVGs als Batch in PNGs zu exportieren?

18

Ich habe diese SVGS und möchte sie in PNG-Bilder exportieren. Ich könnte sie mit Inkscape exportieren, aber das würde bedeuten, jede Datei zu öffnen und diese Datei in PNG zu exportieren, was nicht effizient ist (ich habe Hunderte von ihnen).

Wie kann ich das machen?

Uri Herrera
quelle

Antworten:

16

Inspiriert von der zuvor akzeptierten Antwort habe ich mir diesen Einzeiler ausgedacht:

Für Inkscape Version 0.92.4 und früher:

for file in *.svg; do inkscape $file -e ${file%svg}png; done

Auf diese Weise müssen Sie kein Skript aufrufen. Wenn Sie möchten, können Sie einen Alias ​​für die Konvertierung aller SVGs im aktuellen Verzeichnis in PNGs erstellen:

alias svgtopng='for file in *.svg; do inkscape $file -e ${file%svg}png; done'

Für Inkscape Version 1.0 Beta und höher:

for file in *.svg; do inkscape $file -o ${file%svg}png; done

Auf diese Weise müssen Sie kein Skript aufrufen. Wenn Sie möchten, können Sie einen Alias ​​für die Konvertierung aller SVGs im aktuellen Verzeichnis in PNGs erstellen:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'
Matthias Brandt
quelle
1
${file%svg}pngist ein toller Trick! Das hatte ich noch nie gesehen.
Chester
Ich denke, das funktioniert nicht mit Leerzeichen in Dateinamen.
Genom
26

Sie können Inkscape anscheinend über die Befehlszeile verwenden:

`#{INKSCAPE_PATH} -z -f #{source_svg} -w #{width} -j -e #{dest_png}`

mehr Details

Ich stelle mir vor, Sie können ein einfaches Bash-Skript schreiben, um alle SVG-Dateien zu verarbeiten:

#!/bin/sh

for file in *.svg
do
     /usr/bin/inkscape -z -f "${file}" -w 640 -e "${file}.png"
done

Das obige Beispiel konvertiert alle .svg-Dateien im aktuellen Verzeichnis und fügt den Ausgabedateien die Erweiterung .png hinzu.

Sergey
quelle
Ich versuche, mehrere hundert SVGs zu exportieren. Wie kann ich den Exportwert (dest) einstellen, damit sie ihren Namen behalten? denn dies scheint für eine kleine Menge gut zu funktionieren.
Uri Herrera
@UriHerrera: Ich habe die Antwort aktualisiert
Sergey
Alle Dateien werden im Format {file} .svg.png anstelle von {file} .png gespeichert. Wie kann man das beheben? und auch auf dem Original-SVG erscheint unten rechts ein kleines Verknüpfungssymbol, das verschwindet, wenn es in PNG konvertiert wird (ich versuche, das Icons-Pack zu konvertieren)
Tosho
@Tosho Derzeit bin ich auf Windows, aber es sollte so etwas wie dieses: pastebin.com/TEDfvxPC
user31389
2
@ Tosho können Sie auch tun ${file%svg}png. Sie können hier für weitere Möglichkeiten lesen .
JJ
5

Grafisches Nautilus-Skript


Überblick

Die Befehlszeile ist ideal für Batch-Konvertierungen, aber manchmal möchten Sie einfach nicht den Komfort Ihrer GUI verlassen. Aus diesem Grund habe ich ein GUI-basiertes Nautilus-Skript programmiert, um SVG-Dateien in PNG-Bilder zu konvertieren. Andere Dateimanager mit benutzerdefinierten Aktionen (z. B. Thunar) sollten ebenfalls unterstützt werden.

Bildschirmfoto

Bildbeschreibung hier eingeben

Skript

#!/bin/bash

# NAME:         SVG2PNG
# VERSION:      0.1
# AUTHOR:       (c) 2014 Glutanimate (https://github.com/Glutanimate)
#
# DESCRIPTION:  Simple application to convert SVG files to PNG files based on DPI or resolution. 
#               Designed to work as a context menu script in file managers like Nautilus and Thunar.
#
# FEATURES:     - Converts SVG image file to PNG raster of a specific DPI or width
#               - SVG preview
#               - choose between converting the full SVG page or only the cropped image
#
# DEPENDENCIES: inkscape imagemagick yad
#               YAD (1) is an advanced for of Zenity with many improvements. It's not included in the
#               official Ubuntu repos yet (2) but can be installed from a webupd8 PPA (3)
#
# LICENSE:      MIT license (http://opensource.org/licenses/MIT)
#
# NOTICE:       THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
#               INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
#               PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
#               LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
#               TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
#               OR OTHER DEALINGS IN THE SOFTWARE.
#
#
# USAGE:        SVG2PNG image1.svg image2.svg [..]
#               I recommend installing this script as a context menu action for your file manager.
#               Instructions for Nautilus may be found on AskUbuntu (4).
#
# NOTES:        The script uses convert for previews because it's faster. For optimal results
#               the actual conversion is done with inkscape's command line interface.
#
# LINKS:        (1) https://code.google.com/p/yad/
#               (2) https://bugs.launchpad.net/ubuntu/+bug/796633
#               (3) https://launchpad.net/~webupd8team/+archive/y-ppa-manager
#               (4) /ubuntu/236414/how-can-i-install-a-nautilus-script

############## DIALOGS ###################

TITLE="SVG to PNG"
ICON="svg"

############## USGCHECKS #################

# checks if user selected an item

if [ $# -eq 0 ]
  then
      yad --title="$TITLE" \
          --image=dialog-error \
          --window-icon=dialog-error \
          --class="$WMCLASS" \
          --text="Error: no file selected" \
          --button="Ok":0
      echo "Error: no file selected"
      exit
fi

############### GLOBVAR ##################

SVGFILES="$@"
TEMPDIR=$(mktemp -d)
PREVIEWIMG="$TEMPDIR/svgpreview.png"

############### CLEANUP ##################

trap "rm -r $TEMPDIR" EXIT 

############## FUNCTIONS #################

converttosvg_dpi(){

echo "Converting based on DPI."

while [ $# -gt 0 ]; do

    echo "$# file(s) left to convert."
    SVGFILE="$1"
    FILESTEM="${SVGFILE%%.*}"
    PNGFILE="$FILESTEM".png
    inkscape "$SVGFILE" -z --export-dpi="$DPI" \
    --"$AREASETTING" --export-png="$PNGFILE"
    shift

done
echo "Done."

}

converttosvg_res(){

echo "Converting based on Width."

while [ $# -gt 0 ]; do

    echo "$# file(s) left to convert."
    SVGFILE="$1"
    FILESTEM="${SVGFILE%%.*}"
    PNGFILE="$FILESTEM".png
    inkscape "$SVGFILE" -z --export-width="$WIDTH" \
    --"$AREASETTING" --export-png="$PNGFILE"
    shift

done
echo "Done."

}

createpreview() {
convert -resize 128x "$1" "$PREVIEWIMG"
}

getsettings() {

SETTINGS=$(yad --window-icon "$ICON" --image "$PREVIEWIMG" --width 300 --height 200 --always-print-result \
--form --separator="|" --title="$TITLE" --text "Please choose the DPI or resolution to convert to." \
--field="DPI:NUM" 10[!80..600[!10]] --field="Width in px:NUM" 16[!16..4096[!16]] \
--field="Area:":CB "Drawing"\!"Page" \
--button="Convert based on DPI:2" --button="Convert based on Resolution:3" --button="gtk-cancel:1")

RET=$? # Exit code?

if [ "$RET" = 252 ] || [ "$RET" = 1 ]  # WM-Close or "Abort"
  then
      echo "Exiting..."
      exit
fi

DPI=$(printf %.0f $(cut -d "|" -f 1 <<<"$SETTINGS")) #round values
WIDTH=$(printf %.0f $(cut -d "|" -f 2 <<<"$SETTINGS"))
AREA=$(cut -d "|" -f 3 <<<"$SETTINGS")

case "$AREA" in

Drawing)
  AREASETTING="export-area-drawing"
  ;;

Page)
  AREASETTING="export-area-page"
  ;;

esac

echo "DPI set to $DPI"
echo "Width set to $WIDTH"
echo "Area set to $AREA"

}


################ MAIN ####################

createpreview "$1"
getsettings

case "$RET" in

2)
  echo 2
  converttosvg_dpi "$@"
  ;;

3)
  echo 3
  converttosvg_res "$@"
  ;;

esac

exit 0

Ich werde versuchen, diese Antwort auf dem neuesten Stand zu halten. Die neueste Version des Skripts finden Sie jedoch in meinem Github-Repository .

Installation

Eine allgemeine Installationsanleitung für alle Nautilus-Skripte finden Sie hier . Die folgenden Befehle sollten alle erforderlichen Abhängigkeiten abdecken:

sudo add-apt-repository ppa:webupd8team/y-ppa-manager
sudo apt-get update
sudo apt-get install yad inkscape imagemagick

Weitere Informationen finden Sie in der obigen Skriptüberschrift.

Verwendung

Nach der Installation des Skripts sollten Sie es über das Kontextmenü Ihres Dateimanagers aufrufen können. Wählen Sie einfach eine oder mehrere SVG-Dateien aus und klicken Sie auf den entsprechenden Eintrag in Ihrem Kontextmenü. Ein GUI-Dialog sollte verschiedene Optionen für die Konvertierung enthalten.

Sie können die SVG-Datei entweder nach DPI oder nach Breite konvertieren. Das Seitenverhältnis bleibt in beiden Fällen erhalten. Stellen Sie sicher, dass Sie die gewünschte DPI oder Breite angeben, bevor Sie auf die Konvertierungsschaltflächen klicken.

Sie können auch wählen, ob Sie die gesamte SVG-Datei oder nur die zugeschnittene Zeichnung exportieren möchten. Wenn Ihre SVG-Zeichenfläche viel freien Speicherplatz hat, empfiehlt es sich, "Zeichnung" als Exportoption zu wählen.

Glutanimate
quelle
2

Hier ist eine etwas andere alternative Lösung in einer besser lesbaren Skriptsprache - Python. Es kann alle Ihre SVGs stapelweise exportieren. Besonders ideal, wenn Sie Android-Entwickler sind und mehrere PNGs aus einer einzigen SVG erstellen müssen.

Haftungsausschluss: Ich habe die Bibliothek geschrieben. Hoffe es hilft jemandem.

Klicken Sie hier .

Laden Sie für eine einfache Verwendung die Bibliothek in einen Ordner herunter, legen Sie die svgs im selben Ordner ab und führen Sie sie aus

python exporter.py

in der Kommandozeile / Terminal, nachdem Sie cdin den Ordner. Weitere Optionen finden Sie in der README-Datei .

Kevin Lee
quelle
Danke David, ich habe meine Antwort bearbeitet, um mehr Details zu liefern!
Kevin Lee
1

Wenn nicht alle Dateien, sondern nur bestimmte SVG - Dateien müssen PNG konvertiert werden, so könnte man verwenden , sedautomatisch die Dateinamen zu erzeugen:

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
Serge Stroobandt
quelle