Есть ли способ пакетного экспорта SVG в PNG?


18

У меня есть эти SVGS, и я хотел бы экспортировать их в изображения PNG, я мог бы экспортировать их с помощью Inkscape, но это означало бы открыть каждый файл и экспортировать этот файл в PNG, что неэффективно (у меня их сотни).

Как я могу это сделать?

Ответы:


16

Вдохновленный ранее принятым ответом, я придумал такую ​​строку:

Для Inkscape версии 0.92.4 и более ранних:

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

Таким образом, вам не нужно вызывать скрипт. Если вы хотите, вы можете создать псевдоним для преобразования всех svgs в текущем каталоге в pngs:

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

Для бета-версии Inkscape версии 1.0 и выше:

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

Таким образом, вам не нужно вызывать скрипт. Если вы хотите, вы можете создать псевдоним для преобразования всех svgs в текущем каталоге в pngs:

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

1
${file%svg}pngэто отличный трюк! Я не видел этого раньше.
Честер

Я думаю, что это не работает с пробелами в именах файлов.
Геном

26

Похоже, вы можете использовать Inkscape из командной строки:

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

больше деталей

Я полагаю, вы можете написать простой скрипт bash для обработки всех файлов SVG:

#!/bin/sh

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

Приведенный выше пример преобразует все файлы .svg в текущем каталоге, добавляя расширение .png к выходным файлам.


Я пытаюсь экспортировать несколько сотен svgs, как я могу установить значение экспорта (dest), чтобы они сохранили свое имя? потому что это, кажется, работает хорошо для небольшого количества.
Ури Эррера

@UriHerrera: я обновил ответ
Сергей

все файлы сохраняются в формате {file} .svg.png вместо {file} .png? как это исправить? а также на оригинальном SVG появляется маленький ярлык в правом нижнем углу, который исчезает при преобразовании в PNG (я пытаюсь преобразовать пакет значков)
Tosho

@Tosho В настоящее время я нахожусь на Windows, но это должно быть что-то вроде этого: pastebin.com/TEDfvxPC
user31389

2
@ Тошо Вы тоже можете сделать ${file%svg}png. Вы можете прочитать здесь для получения дополнительной возможности.
Джа

5

Графический скрипт Nautilus


обзор

Командная строка отлично подходит для пакетных преобразований, но иногда вы просто не хотите выходить из своего графического интерфейса. Вот почему я кодировал скрипт Nautilus на основе графического интерфейса для пакетного преобразования файлов SVG в изображения PNG. Другие файловые менеджеры с пользовательскими действиями (например, Thunar) также должны поддерживаться.

Скриншот

введите описание изображения здесь

скрипт

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

Я постараюсь обновлять этот ответ, но, пожалуйста, проверьте мой репозиторий Github для последней версии скрипта.

Установка

Общие инструкции по установке для всех сценариев Nautilus можно найти здесь . Следующие команды должны охватывать все необходимые зависимости:

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

Для получения дополнительной информации, пожалуйста, обратитесь к заголовку сценария выше.

использование

После установки скрипта вы сможете вызвать его из контекстного меню вашего файлового менеджера. Просто выберите один или несколько файлов SVG и нажмите на соответствующую запись в контекстном меню. В диалоговом окне с графическим интерфейсом должны появиться несколько опций для преобразования.

Вы можете конвертировать SVG на основе DPI или ширины. Соотношение сторон будет сохраняться в обоих случаях. Убедитесь, что вы указали свой DPI или ширину, прежде чем нажимать на кнопки конвертации.

Вы также можете выбрать экспорт полного файла SVG или только обрезанного чертежа. Если на вашем холсте SVG много свободного места, рекомендуется выбрать «Рисование» в качестве опции экспорта.


2

Вот немного другое альтернативное решение в более читаемом языке сценариев - Python. Он может пакетно экспортировать все ваши svgs. Особенно идеально, если вы работаете с Android-разработчиком и хотите сделать несколько PNG-файлов из одного SVG.

Отказ от ответственности: я написал lib. Надеюсь, это кому-нибудь поможет.

Нажмите здесь .

Для простого использования загрузите библиотеку в папку, поместите svgs в ту же папку и запустите

python exporter.py

в командной строке / терминале за вами cdв папку. Для более продвинутых опций, проверьте README .


Спасибо Дэвид, я отредактировал свой ответ, чтобы предоставить больше деталей!
Кевин Ли

1

Если не все файлы, а только определенные SVG-файлы необходимо преобразовать в PNG, можно использовать sedавтоматическую генерацию имен файлов:

inkscape --without-gui --export-width=1280 --export-png=`echo $1 |sed -e 's/svg$/png/'` $1
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.