Как разместить рисунки SVG на холсте в командной строке?

13

Обрезка .svgфайлов в командной строке проста: $ inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Мне нужно сделать наоборот. Я хочу поместить рисунок в 64 x 64холст точек (уже установлен во всех .svgфайлах). К сожалению, Inkscape не предоставляет FitDrawingToCanvasкоманду. Кроме того, фитинг должен сохранять пропорции рисунка.

Если это имеет значение: я использую Ubuntu raring.

Стефан Эндруллис
источник
1
Будет ли изменять размер после подгонки холста к рисунку? См. Graphicdesign.stackexchange.com/questions/6574/…
Таккат
Два вопроса: (1) размер холста уже установлен в каждом случае, но рисунки больше, чем холст; или вы вставляете чертеж SVG в другой документ SVG ?; (2) «сохранять пропорции»: это сбивает с толку в свете 64-пиксельного квадратного холста, упомянутого в ваших вопросах, но есть ли у вас предложенный автоматизированный процесс принятия решения о том, как обращаться с не квадратным материалом? например, высота должна быть 64pt во всех случаях ...
horatio
@ Takkat: Спасибо за подсказку. Рабочий процесс работает, но соотношение сторон разрушается. Будет искать решение для этого ...
Стефан Эндруллис
@horatio: (1) рисунок меньше, чем холст, и да, оба находятся в одном файле. (2) Я хочу масштабировать чертеж до точки, в которой max (drawingWidth, drawingHeight) = 64pt.
Стефан Эндруллис
@Takkat: у rsvg-convert есть аргумент --keep-aspect-ratio :)
Стефан Эндруллис

Ответы:

2

Я нашел способ сделать это в этом вопросе: Inkscape - рисование по центру на странице через командную строку / терминал

С "foo.svg" в качестве изображения для редактирования:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit foo.svg

Чтобы отредактировать все изображения SVG в текущем каталоге:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileClose *.svg

Но эта вторая команда открывает массу окон, которые приведут к сбою компьютера, если вы редактируете слишком много изображений. Только для Linux эта команда будет работать лучше:

for img in $(ls *.svg) ; do inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; done

Для приведенной выше команды, если какой-либо из файлов является символической ссылкой, Inkscape отредактирует целевой файл, на который указывает символическая ссылка. Если вы не хотите, чтобы Inkscape делал это, вы можете отфильтровать любые символические ссылки с помощью этой команды:

for img in $(ls *.svg) ; do if [[ $(readlink $img) == "" ]] ; then inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; fi ; done


Пока я в этом, я мог бы также опубликовать скрипт bash, который я сделал для этого:

#!/bin/bash
# inkscape-center <file-or-directory>...

_analyse() {
    if [ -d "${1}" ] ; then
        _centerAll "${1}" ;
    else
        _center "${1}" ;
    fi
}

_centerAll() {
    cd "${1}" ;
    for img in $(ls "*.svg") ; do
        _filterSyms "${img}" ;
    done
}

_filterSyms() {
    if [[ $(readlink "${1}") == "" ]] ; then
        _center "${1}"
    fi
}

_center() {
    inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit "${1}"
}

for arg ; do
    _analyse "${arg}" ;
done

Я позвонил inkscape-centerи запустил это так:

inkscape-center <file-or-directory>

Требуется столько аргументов, сколько вы хотите, так что вы можете сделать что-то вроде этого:

inkscape-center 1st.svg 2nd.svg 3rd.svg 4th.svg

Будьте осторожны - если вы укажете каталог вместо файла, он отредактирует каждый файл SVG в этом каталоге.

GreenRaccoon23
источник
1

Вы можете использовать viewBox, чтобы выполнить то, что вы хотите. Я не знаю, есть ли способ сделать это из Inkscape, но так как SVG - это стандартный формат, и может быть другой инструмент, который будет выполнять ту работу, которую вы хотите. Быстрый поиск «инструментов командной строки svg» выявил некоторые интересные результаты, в том числе этот для создания иконок CSS.

Второй вариант - написать собственный инструмент на выбранном вами языке. Основная суть в том, чтобы установить viewBox на высоту вашего документа, а затем установить ширину и высоту документа, который вы хотите. Наконец, установите атрибут preserveAspectRatio.

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

<svg
   width="64"
   height="64"
   viewBox="0 0 744 1052"
    preserveAspectRatio="xMinYMin slice"
BrianV
источник