Existe uma maneira de exportar lotes SVGs para PNGs?

18

Eu tenho esses SVGS e gostaria de exportá-los para imagens PNG, poderia exportá-los com o Inkscape, mas isso significaria abrir cada arquivo e exportá-lo para PNG, o que não é eficiente (tenho centenas deles).

Como posso fazer isso?

Uri Herrera
fonte

Respostas:

16

Inspirado pela resposta anteriormente aceita, vim com essa frase:

Para o Inkscape versão 0.92.4 e anterior:

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

Dessa forma, você não precisa chamar um script. Se desejar, você pode criar um alias para converter todos os svgs no diretório atual em pngs:

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

Para o Inkscape versão 1.0 Beta e posterior:

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

Dessa forma, você não precisa chamar um script. Se desejar, você pode criar um alias para converter todos os svgs no diretório atual em pngs:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'
Matthias Brandt
fonte
1
${file%svg}pngé um ótimo truque! Eu não tinha visto isso antes.
Chester
Eu acho que isso não funciona com espaços em nomes de arquivos.
Genom 31/07
26

Parece que você pode usar o Inkscape na linha de comando:

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

mais detalhes

Eu imagino que você pode escrever um script bash simples para processar todos os arquivos SVG:

#!/bin/sh

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

o exemplo acima converte todos os arquivos .svg no diretório atual, adicionando a extensão .png aos arquivos de saída.

Sergey
fonte
Estou tentando exportar várias centenas de svgs, como posso definir o valor da exportação (dest) para que eles mantenham o nome? porque isso parece funcionar bem para uma pequena quantidade.
Uri Herrera
@UriHerrera: Eu atualizei a resposta
Sergey
todos os arquivos são salvos no formato {file} .svg.png em vez de {file} .png? como consertar isso? e também sobre o SVG originais parece pequeno ícone de atalho no canto inferior direito que desaparecem quando é convertido em PNG (Eu estou tentando ícones converter embalar)
Tosho
@Tosho Atualmente, estou no Windows, mas deve ser algo assim: pastebin.com/TEDfvxPC
user31389
2
@Tosho Você também pode fazer ${file%svg}png. Você pode ler aqui para mais possibilidades.
JJA
5

Script gráfico do Nautilus


Visão geral

A linha de comando é ótima para conversões em lote, mas às vezes você não deseja deixar o conforto da sua GUI. É por isso que codifiquei um script Nautilus baseado em GUI para converter arquivos SVG em lote em imagens PNG. Outros gerenciadores de arquivos com ações personalizadas (por exemplo, Thunar) também devem ser suportados.

Captura de tela

insira a descrição da imagem aqui

Roteiro

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

Tentarei manter essa resposta atualizada, mas verifique o repositório do Github para obter a versão mais recente do script.

Instalação

Instruções de instalação genérica para todos os scripts do Nautilus podem ser encontradas aqui . Os seguintes comandos devem cobrir todas as dependências necessárias:

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

Para mais informações, consulte o cabeçalho do script acima.

Uso

Depois de instalar o script, você poderá chamá-lo no menu de contexto do seu gerenciador de arquivos. Basta selecionar um ou mais arquivos SVG e clicar na entrada apropriada no seu menu de contexto. Uma caixa de diálogo da GUI deve apresentar várias opções relacionadas à conversão.

Você pode converter o SVG com base no DPI ou na largura. A proporção será preservada nos dois casos. Certifique-se de fornecer seu DPI ou largura de escolha antes de clicar nos botões de conversão.

Você também pode escolher entre exportar o arquivo SVG completo ou apenas o desenho cortado. Se a tela SVG tiver muito espaço vazio, é recomendável escolher "Desenho" como opção de exportação.

Glutanimado
fonte
2

Aqui está uma solução alternativa ligeiramente diferente em uma linguagem de script mais legível - python. Pode exportar em lote todos os seus svgs. Particularmente ideal se você estiver desenvolvendo Android e tiver que criar vários pngs a partir de um único svg.

Disclaimer: Eu escrevi a lib. Espero que ajude alguém.

Clique aqui .

Para um uso simples, faça o download da biblioteca em uma pasta, coloque os svgs na mesma pasta e execute

python exporter.py

na linha de comando / terminal depois de cdir para a pasta. Para opções mais avançadas, consulte o README .

Kevin Lee
fonte
Obrigado David, editei minha resposta para fornecer mais detalhes!
Kevin Lee
1

Se nem todos os arquivos, mas apenas certos arquivos SVG precisarem ser convertidos em PNG, pode-se usar sedpara gerar automaticamente os nomes dos arquivos:

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