Apakah ada cara untuk batch ekspor SVG ke PNG?

18

Saya memiliki SVGS ini dan saya ingin mengekspornya ke gambar PNG, saya bisa mengekspornya dengan Inkscape tetapi itu berarti membuka setiap file dan mengekspor file itu ke PNG yang tidak efisien (saya punya ratusan di antaranya).

Bagaimana saya bisa melakukan ini?

Uri Herrera
sumber

Jawaban:

16

Terinspirasi oleh jawaban yang sebelumnya diterima saya datang dengan satu kalimat ini:

Untuk Inkscape versi 0.92.4 dan sebelumnya:

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

Dengan cara ini Anda tidak perlu memanggil skrip. Jika Anda mau, Anda bisa membuat alias untuk mengonversi semua svgs di direktori saat ini ke pngs:

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

Untuk Inkscape versi 1.0 Beta dan yang lebih baru:

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

Dengan cara ini Anda tidak perlu memanggil skrip. Jika Anda mau, Anda bisa membuat alias untuk mengonversi semua svgs di direktori saat ini ke pngs:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'
Matthias Brandt
sumber
1
${file%svg}pngadalah trik yang bagus! Saya belum pernah melihat itu sebelumnya.
Chester
Saya pikir ini tidak berfungsi dengan spasi di nama file.
Genom
26

Tampaknya Anda dapat menggunakan Inkscape dari baris perintah:

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

keterangan lebih lanjut

Saya membayangkan Anda dapat menulis skrip bash sederhana untuk memproses semua file SVG:

#!/bin/sh

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

contoh di atas mengkonversi semua file .svg di direktori saat ini, menambahkan ekstensi .png ke file output.

Sergey
sumber
Saya mencoba untuk mengekspor beberapa ratus svgs, bagaimana saya bisa menetapkan nilai ekspor (dest) sehingga mereka mempertahankan namanya? karena ini tampaknya berfungsi dengan baik untuk jumlah kecil.
Uri Herrera
@ UriHerrera: Saya memperbarui jawabannya
Sergey
semua file disimpan dalam format {file} .svg.png alih-alih {file} .png? bagaimana cara memperbaikinya? dan juga pada SVG asli, muncul ikon jalan pintas kecil di kanan bawah yang hilang ketika dikonversi ke PNG (Saya mencoba mengonversi ikon pak)
Tosho
@Tosho Saat ini saya menggunakan Windows, tetapi harus seperti ini: pastebin.com/TEDfvxPC
user31389
2
@Tosho Anda juga bisa melakukannya ${file%svg}png. Anda dapat membaca di sini untuk lebih banyak kemungkinan.
jja
5

Script Grafik Nautilus


Gambaran

Baris perintah sangat bagus untuk konversi batch tetapi kadang-kadang Anda hanya tidak ingin meninggalkan kenyamanan GUI Anda. Itu sebabnya saya mengkodekan skrip Nautilus berbasis GUI untuk batch mengkonversi file SVG ke gambar PNG. Manajer file lain dengan tindakan khusus (mis. Thunar) juga harus didukung.

Tangkapan layar

masukkan deskripsi gambar di sini

Naskah

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

Saya akan mencoba untuk menjaga jawaban ini diperbarui tetapi silakan periksa repositori Github saya untuk versi terbaru dari skrip.

Instalasi

Instruksi pemasangan umum untuk semua skrip Nautilus dapat ditemukan di sini . Perintah berikut harus mencakup semua dependensi yang diperlukan:

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

Untuk informasi lebih lanjut, silakan baca header skrip di atas.

Pemakaian

Setelah menginstal skrip Anda harus dapat memintanya dari menu konteks manajer file Anda. Cukup pilih satu atau lebih file SVG dan klik entri yang sesuai di menu konteks Anda. Dialog GUI harus muncul dengan beberapa opsi untuk menyelesaikan konversi.

Anda dapat mengonversi SVG berdasarkan DPI atau lebar. Rasio aspek akan dilestarikan dalam kedua kasus. Pastikan untuk memberikan DPI atau lebar pilihan Anda sebelum mengklik tombol konversi.

Anda juga dapat memilih antara mengekspor file SVG lengkap atau hanya gambar yang dipangkas. Jika kanvas SVG Anda memiliki banyak ruang kosong, disarankan untuk memilih "Gambar" sebagai opsi ekspor.

Glutanimate
sumber
2

Berikut adalah solusi alternatif yang sedikit berbeda dalam bahasa scripting yang lebih mudah dibaca - python. Itu dapat batch ekspor semua svgs Anda. Sangat ideal jika Anda melakukan dev Android dan harus membuat beberapa png dari satu svg.

Penafian: Saya menulis lib. Semoga ini bisa membantu seseorang.

Klik di sini .

Untuk penggunaan sederhana, unduh pustaka ke dalam folder, letakkan svgs di folder yang sama, lalu jalankan

python exporter.py

di baris perintah / terminal setelah Anda cdke folder. Untuk opsi lebih lanjut, lihat README .

Kevin Lee
sumber
Terima kasih David, saya telah mengedit jawaban saya untuk memberikan perincian lebih lanjut!
Kevin Lee
1

Jika tidak semua file, tetapi hanya file SVG tertentu yang perlu dikonversi ke PNG, yang mungkin digunakan seduntuk secara otomatis menghasilkan nama file:

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