Czy istnieje sposób na grupowe eksportowanie plików SVG do plików PNG?

18

Mam te SVGS i chciałbym je wyeksportować do obrazów PNG, mógłbym je wyeksportować za pomocą Inkscape, ale oznaczałoby to otwarcie każdego pliku i wyeksportowanie tego pliku do PNG, który nie jest wydajny (mam ich setki).

W jaki sposób mogę to zrobić?

Uri Herrera
źródło

Odpowiedzi:

16

Zainspirowany wcześniej zaakceptowaną odpowiedzią wymyśliłem ten jednowarstwowy:

W przypadku Inkscape w wersji 0.92.4 i wcześniejszych:

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

W ten sposób nie musisz wywoływać skryptu. Jeśli chcesz, możesz utworzyć alias do konwersji wszystkich plików svgs w bieżącym katalogu do pngs:

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

W przypadku wersji Inkscape 1.0 Beta i nowszych:

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

W ten sposób nie musisz wywoływać skryptu. Jeśli chcesz, możesz utworzyć alias do konwersji wszystkich plików svgs w bieżącym katalogu do pngs:

alias svgtopng='for file in *.svg; do inkscape $file -o ${file%svg}png; done'
Matthias Brandt
źródło
1
${file%svg}pngto świetna sztuczka! Nie widziałem tego wcześniej.
Chester,
Myślę, że to nie działa ze spacjami w nazwach plików.
Genom
26

Wygląda na to, że możesz używać Inkscape z wiersza poleceń:

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

więcej szczegółów

Wyobrażam sobie, że możesz napisać prosty skrypt bash do przetwarzania wszystkich plików SVG:

#!/bin/sh

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

powyższy przykład konwertuje wszystkie pliki .svg w bieżącym katalogu, dodając rozszerzenie .png do plików wyjściowych.

Siergiej
źródło
Próbuję wyeksportować kilkaset plików svg. Jak ustawić wartość eksportu (dest), aby zachowały swoją nazwę? ponieważ wydaje się, że działa to dobrze dla niewielkiej ilości.
Uri Herrera
@UriHerrera: Zaktualizowałem odpowiedź
Sergey
wszystkie pliki są zapisywane w formacie {plik} .svg.png zamiast {plik} .png? jak to naprawić? a także na oryginalnym SVG pojawia się mała ikona skrótu w prawym dolnym rogu, która znika, gdy jest konwertowana na PNG (próbuję przekonwertować pakiet ikon)
Tosho
@Tosho Obecnie jestem w systemie Windows, ale powinno to być coś takiego: pastebin.com/TEDfvxPC
user31389
2
@Tosho Możesz także zrobić ${file%svg}png. Możesz przeczytać tutaj, aby uzyskać więcej możliwości.
jja
5

Graficzny skrypt nautilusa


Przegląd

Wiersz poleceń jest świetny do konwersji wsadowych, ale czasami po prostu nie chcesz rezygnować z wygody GUI. Właśnie dlatego napisałem skrypt Nautilus oparty na graficznym interfejsie użytkownika, aby wsadowo konwertować pliki SVG na obrazy PNG. Należy także wspierać inne menedżery plików z niestandardowymi akcjami (np. Thunar).

Zrzut ekranu

wprowadź opis zdjęcia tutaj

Scenariusz

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

Postaram się aktualizować tę odpowiedź, ale proszę sprawdzić moje repozytorium Github dla najnowszej wersji skryptu.

Instalacja

Ogólne instrukcje instalacji dla wszystkich skryptów Nautilus można znaleźć tutaj . Następujące polecenia powinny obejmować wszystkie niezbędne zależności:

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

Więcej informacji można znaleźć w nagłówku skryptu powyżej.

Stosowanie

Po zainstalowaniu skryptu powinieneś być w stanie wywołać go z menu kontekstowego menedżera plików. Po prostu wybierz jeden lub więcej plików SVG i kliknij odpowiedni wpis w menu kontekstowym. W oknie dialogowym GUI powinno pojawić się kilka opcji dotyczących konwersji.

Możesz przekonwertować SVG na podstawie DPI lub szerokości. Współczynnik proporcji zostanie zachowany w obu przypadkach. Pamiętaj, aby podać DPI lub szerokość wyboru przed kliknięciem przycisków konwersji.

Możesz także wybrać pomiędzy eksportowaniem pełnego pliku SVG lub tylko przyciętego rysunku. Jeśli na płótnie SVG jest dużo pustej przestrzeni, zaleca się wybranie opcji „Rysunek” jako opcji eksportu.

Glutanimate
źródło
2

Oto nieco inne alternatywne rozwiązanie w bardziej czytelnym języku skryptowym - python. Może eksportować wsadowo wszystkie twoje pliki svg. Szczególnie idealny, jeśli robisz programistę dla Androida i musisz wykonać wiele pngów z jednego pliku SVG.

Uwaga: Napisałem lib. Mam nadzieję, że to komuś pomoże.

Kliknij tutaj .

Dla prostego użycia pobierz bibliotekę do folderu, umieść pliki svgs w tym samym folderze, a następnie uruchom

python exporter.py

w wierszu poleceń / terminalu po przejściu cddo folderu. Aby uzyskać bardziej zaawansowane opcje, sprawdź README .

Kevin Lee
źródło
Dzięki David, zredagowałem swoją odpowiedź, aby podać więcej szczegółów!
Kevin Lee
1

Jeśli nie wszystkie pliki, ale tylko niektóre pliki SVG muszą zostać przekonwertowane na format PNG, można użyć seddo automatycznego wygenerowania nazw plików:

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
Serge Stroobandt
źródło