¿Hay alguna manera de exportar por lotes SVG a PNG?

18

Tengo estos SVGS y me gustaría exportarlos a imágenes PNG, podría exportarlos con Inkscape, pero eso significaría abrir cada archivo y exportar ese archivo a PNG que no es eficiente (tengo cientos de ellos).

¿Cómo puedo hacer esto?

Uri Herrera
fuente

Respuestas:

16

Inspirado por la respuesta previamente aceptada, se me ocurrió esta frase:

Para Inkscape versión 0.92.4 y anterior:

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

De esta manera no necesita llamar a un script. Si quisieras, podrías crear un alias para convertir todos los svgs en el directorio actual a pngs:

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

Para Inkscape versión 1.0 Beta y posterior:

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

De esta manera no necesita llamar a un script. Si quisieras, podrías crear un alias para convertir todos los svgs en el directorio actual a pngs:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'
Matthias Brandt
fuente
1
${file%svg}pnges un gran truco! No había visto eso antes.
Chester
Creo que esto no funciona con espacios en los nombres de archivo.
Genom
26

Parece que puedes usar Inkscape desde la línea de comandos:

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

más detalles

Me imagino que puedes escribir un script bash simple para procesar todos los archivos SVG:

#!/bin/sh

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

el ejemplo anterior convierte todos los archivos .svg en el directorio actual, agregando la extensión .png a los archivos de salida.

Sergey
fuente
Estoy tratando de exportar varios cientos de svgs, ¿cómo puedo configurar el valor de exportación (dest) para que mantengan su nombre? porque esto parece funcionar bien para una pequeña cantidad.
Uri Herrera
@UriHerrera: Actualicé la respuesta
Sergey
todos los archivos se guardan en formato {archivo} .svg.png en lugar de {archivo} .png? ¿Cómo arreglar eso? y también en el SVG original, aparece un pequeño ícono de acceso directo en la parte inferior derecha que desaparece cuando se convierte a PNG (estoy tratando de convertir el paquete de iconos)
Tosho
@Tosho Actualmente estoy en Windows, pero debería ser algo como esto: pastebin.com/TEDfvxPC
user31389
2
@Tosho También puedes hacerlo ${file%svg}png. Puedes leer aquí para más posibilidades.
jja
5

Guión gráfico de Nautilus


Visión general

La línea de comando es ideal para las conversiones por lotes, pero a veces simplemente no desea dejar la comodidad de su GUI. Es por eso que codifiqué un script Nautilus basado en GUI para convertir por lotes archivos SVG a imágenes PNG. También deberían admitirse otros administradores de archivos con acciones personalizadas (por ejemplo, Thunar).

Captura de pantalla

ingrese la descripción de la imagen aquí

Guión

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

Intentaré mantener esta respuesta actualizada, pero consulte mi repositorio de Github para obtener la última versión del script.

Instalación

Las instrucciones de instalación genéricas para todos los scripts de Nautilus se pueden encontrar aquí . Los siguientes comandos deben cubrir todas las dependencias necesarias:

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

Para obtener más información, consulte el encabezado del script anterior.

Uso

Después de instalar el script, debería poder invocarlo desde el menú contextual del administrador de archivos. Simplemente seleccione uno o más archivos SVG y haga clic en la entrada correspondiente en su menú contextual. Un cuadro de diálogo GUI debería tener varias opciones relacionadas con la conversión.

Puede convertir el SVG basado en DPI o ancho. La relación de aspecto se conservará en ambos casos. Asegúrese de proporcionar su DPI o ancho de elección antes de hacer clic en los botones de conversión.

También puede elegir entre exportar el archivo SVG completo o solo el dibujo recortado. Si su lienzo SVG tiene mucho espacio vacío, es recomendable elegir "Dibujo" como opción de exportación.

Glutanimato
fuente
2

Aquí hay una solución alternativa ligeramente diferente en un lenguaje de script más legible: python. Puede exportar por lotes todos sus svgs. Particularmente ideal si está haciendo un desarrollo de Android y tiene que hacer múltiples pngs desde un solo svg.

Descargo de responsabilidad: escribí la lib. Espero que ayude a alguien.

Haga clic aquí .

Para un uso simple, descargue la biblioteca en una carpeta, coloque los svgs en la misma carpeta, luego ejecute

python exporter.py

en la línea de comando / terminal después de ti cda la carpeta. Para opciones más avanzadas, consulte el archivo README .

Kevin Lee
fuente
Gracias David, ¡he editado mi respuesta para proporcionar más detalles!
Kevin Lee
1

Si no todos los archivos, pero solo ciertos archivos SVG necesitan convertirse a PNG, uno podría usar sedpara generar automáticamente los nombres de los archivos:

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