C'è un modo per esportare in batch SVG in PNG?


18

Ho questi SVGS e vorrei esportarli in immagini PNG, potrei esportarli con Inkscape ma ciò significherebbe aprire ogni file ed esportare quel file in PNG che non è efficiente (ne ho centinaia).

Come posso fare questo?

Risposte:


16

Ispirato dalla risposta precedentemente accettata, mi è venuta in mente questa linea unica:

Per Inkscape versione 0.92.4 e precedenti:

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

In questo modo non è necessario chiamare uno script. Se lo volessi, potresti creare un alias per convertire tutti i svgs nella directory corrente in pngs:

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

Per Inkscape versione 1.0 Beta e successive:

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

In questo modo non è necessario chiamare uno script. Se lo volessi, potresti creare un alias per convertire tutti i svgs nella directory corrente in pngs:

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

1
${file%svg}pngè un grande trucco! Non l'avevo mai visto prima.
Chester,

Penso che questo non funzioni con gli spazi nei nomi dei file.
Genom

26

Sembra che puoi usare Inkscape dalla riga di comando:

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

più dettagli

Immagino che tu possa scrivere un semplice script bash per elaborare tutti i file SVG:

#!/bin/sh

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

l'esempio sopra converte tutti i file .svg nella directory corrente, aggiungendo l'estensione .png ai file di output.


Sto cercando di esportare diverse centinaia di svg, come posso impostare il valore di esportazione (dest) in modo che mantengano il loro nome? perché questo sembra funzionare bene per una piccola quantità.
Uri Herrera,

@UriHerrera: ho aggiornato la risposta
Sergey,

tutti i file vengono salvati nel formato {file} .svg.png anziché {file} .png? come risolverlo? e anche sull'SVG originale appare una piccola icona di scorciatoia in basso a destra che scompare quando viene convertita in PNG (sto cercando di convertire il pacchetto di icone)
Tosho

@Tosho Attualmente sono su Windows, ma dovrebbe essere qualcosa del genere: pastebin.com/TEDfvxPC
user31389

2
@Tosho Puoi anche fare ${file%svg}png. Puoi leggere qui per ulteriori possibilità.
jja,

5

Script nautico grafico


Panoramica

La riga di comando è ottima per le conversioni batch, ma a volte non vuoi lasciare il comfort della tua GUI. Ecco perché ho codificato uno script Nautilus basato su GUI per convertire in batch i file SVG in immagini PNG. Dovrebbero essere supportati anche altri file manager con azioni personalizzate (ad es. Thunar).

Immagine dello schermo

inserisci qui la descrizione dell'immagine

copione

#!/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

Cercherò di mantenere aggiornata questa risposta, ma controlla il mio repository Github per l'ultima versione dello script.

Installazione

Le istruzioni di installazione generiche per tutti gli script Nautilus sono disponibili qui . I seguenti comandi dovrebbero coprire tutte le dipendenze necessarie:

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

Per ulteriori informazioni, consultare l'intestazione dello script sopra.

uso

Dopo aver installato lo script dovresti essere in grado di invocarlo dal menu contestuale del tuo file manager. Basta selezionare uno o più file SVG e fare clic sulla voce appropriata nel menu contestuale. Una finestra di dialogo della GUI dovrebbe presentare diverse opzioni relative alla conversione.

Puoi convertire l'SVG in base a DPI o larghezza. Le proporzioni verranno conservate in entrambi i casi. Assicurati di fornire il tuo DPI o la larghezza di scelta prima di fare clic sui pulsanti di conversione.

Puoi anche scegliere tra esportare il file SVG completo o solo il disegno ritagliato. Se la tua tela SVG ha molto spazio vuoto, è consigliabile scegliere "Disegno" come opzione di esportazione.


2

Ecco una soluzione alternativa leggermente diversa in un linguaggio di scripting più leggibile: python. Può esportare in batch tutti i tuoi svg. Particolarmente ideale se stai sviluppando Android e devi creare più png da un singolo svg.

Disclaimer: ho scritto la lib. Spero che aiuti qualcuno.

Clicca qui .

Per un semplice utilizzo, scarica la libreria in una cartella, inserisci gli svgs nella stessa cartella, quindi esegui

python exporter.py

nella riga di comando / terminale dopo aver cdeffettuato l'accesso alla cartella. Per opzioni più avanzate, consulta il README .


Grazie David, ho modificato la mia risposta per fornire maggiori dettagli!
Kevin Lee,

1

Se non tutti i file, ma solo alcuni file SVG devono essere convertiti in PNG, è possibile utilizzare sedper generare automaticamente i nomi dei file:

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.