Existe-t-il un moyen d'exporter par lots des SVG en PNG?

18

J'ai ces SVGS et je voudrais les exporter en images PNG, je pourrais les exporter avec Inkscape mais cela signifierait ouvrir chaque fichier et exporter ce fichier en PNG qui n'est pas efficace (j'en ai des centaines).

Comment puis-je faire ceci?

Uri Herrera
la source

Réponses:

16

Inspiré par la réponse précédemment acceptée, j'ai trouvé ce one-liner:

Pour Inkscape version 0.92.4 et antérieures:

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

De cette façon, vous n'avez pas besoin d'appeler un script. Si vous le souhaitez, vous pouvez créer un alias pour convertir tous les svgs du répertoire courant en pngs:

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

Pour Inkscape version 1.0 Beta et versions ultérieures:

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

De cette façon, vous n'avez pas besoin d'appeler un script. Si vous le souhaitez, vous pouvez créer un alias pour convertir tous les svgs du répertoire courant en pngs:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'
Matthias Brandt
la source
1
${file%svg}pngest un bon truc! Je n'avais jamais vu ça auparavant.
Chester
Je pense que cela ne fonctionne pas avec des espaces dans les noms de fichiers.
Genom
26

Il semble que vous pouvez utiliser Inkscape à partir de la ligne de commande:

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

plus de détails

J'imagine que vous pouvez écrire un simple script bash pour traiter tous les fichiers SVG:

#!/bin/sh

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

l'exemple ci-dessus convertit tous les fichiers .svg du répertoire actuel, en ajoutant l'extension .png aux fichiers de sortie.

Sergey
la source
J'essaie d'exporter plusieurs centaines de svgs, comment puis-je définir la valeur d'exportation (dest) afin qu'ils conservent leur nom? car cela semble bien fonctionner pour une petite quantité.
Uri Herrera
@UriHerrera: J'ai mis à jour la réponse
Sergey
tous les fichiers sont enregistrés au format {file} .svg.png au lieu de {file} .png? comment y remédier? et aussi sur le SVG d'origine, il apparaît une petite icône de raccourci en bas à droite qui disparaît quand il est converti en PNG (j'essaie de convertir le pack d'icônes)
Tosho
@Tosho Actuellement, je suis sur Windows, mais cela devrait ressembler à ceci: pastebin.com/TEDfvxPC
user31389
2
@Tosho Vous pouvez également le faire ${file%svg}png. Vous pouvez lire ici pour plus de possibilités.
jja
5

Script Nautilus graphique


Aperçu

La ligne de commande est idéale pour les conversions par lots, mais parfois vous ne voulez tout simplement pas quitter le confort de votre interface graphique. C'est pourquoi j'ai codé un script Nautilus basé sur une interface graphique pour convertir par lots des fichiers SVG en images PNG. D'autres gestionnaires de fichiers avec des actions personnalisées (par exemple Thunar) doivent également être pris en charge.

Capture d'écran

entrez la description de l'image ici

Scénario

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

Je vais essayer de garder cette réponse à jour, mais veuillez consulter mon référentiel Github pour la dernière version du script.

Installation

Des instructions d'installation génériques pour tous les scripts Nautilus peuvent être trouvées ici . Les commandes suivantes doivent couvrir toutes les dépendances nécessaires:

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

Pour plus d'informations, veuillez consulter l'en-tête du script ci-dessus.

Usage

Après avoir installé le script, vous devriez pouvoir l'invoquer à partir du menu contextuel de votre gestionnaire de fichiers. Sélectionnez simplement un ou plusieurs fichiers SVG et cliquez sur l'entrée appropriée dans votre menu contextuel. Une boîte de dialogue GUI devrait proposer plusieurs options concernant la conversion.

Vous pouvez convertir le SVG en fonction du DPI ou de la largeur. Le rapport hauteur / largeur sera conservé dans les deux cas. Assurez-vous de fournir votre DPI ou la largeur de votre choix avant de cliquer sur les boutons de conversion.

Vous pouvez également choisir entre exporter le fichier SVG complet ou uniquement le dessin recadré. Si votre canevas SVG a beaucoup d'espace vide, il est conseillé de choisir "Dessin" comme option d'exportation.

Glutanimate
la source
2

Voici une solution alternative légèrement différente dans un langage de script plus lisible - python. Il peut exporter par lots tous vos svgs. Particulièrement idéal si vous faites du développement Android et devez créer plusieurs pngs à partir d'un seul svg.

Avertissement: j'ai écrit la lib. J'espère que cela aide quelqu'un.

Cliquez ici .

Pour une utilisation simple, téléchargez la bibliothèque dans un dossier, placez les svgs dans le même dossier, puis exécutez

python exporter.py

dans la ligne de commande / le terminal après vous cddans le dossier. Pour des options plus avancées, consultez le fichier README .

Kevin Lee
la source
Merci David, j'ai modifié ma réponse pour fournir plus de détails!
Kevin Lee
1

Si tous les fichiers, mais seulement certains fichiers SVG doivent être convertis en PNG, on peut utiliser sedpour générer automatiquement les noms de fichiers:

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