Как я могу масштабировать SVG через командную строку?

17

SVG имеет эти свойства, которые определяют его размер:

width="146.91299pt"
height="78.079002pt"
viewBox="0 0 146.913 78.079"

Я хотел бы масштабировать данный SVG в 400ptкомандной строке без нарушения соотношения сторон. Это означает, что три значения выше должны быть изменены правильно, и все точки в следующем коде SVG. Я не хочу изменять только размер холста, но весь размер изображения SVG. И я не хочу делать это с помощью GUI / вручную, но я хочу сделать это с помощью CLI.

Как я могу автоматически масштабировать SVG с помощью командной строки до заданной ширины?

Причина: предварительный просмотр Википедии выглядит плохо, если изображение слишком маленькое. Смотрите это изображение в качестве примера.

Как бы я сделал эту задачу с Inkscape-GUI

  1. Shift + Ctrl + M (Преобразование)
  2. Шкала (отметьте «пропорционально масштабировать»)
  3. Введите ширину
  4. Shift + Ctrl + D (Свойства документа)
  5. Подогнать страницу к выбору

Теперь я хочу автоматический CLI-способ сделать это.

Кстати, Inkscape просто применяется

<g transform="matrix(1.6838397,0,0,1.6838397,-3.3543029,-3.3542794)"
 id="surface0">

на весь образ.

Мартин Тома
источник
Какую ОС вы используете?
Тердон
Ubuntu 10.04.4 LTS (я собираюсь обновить его ...)
Мартин Тома
SVG-файлы - это просто текстовые файлы. Вы можете редактировать этот файл и изменить width, heightи viewBoxзначение к чему - то вроде width="100%" height="100%" viewBox="0 0 400 212.58569".
Мартино
Я знаю, что это только текстовые файлы. Но если я редактирую только эти значения, размер изображения не меняется. Изменяется только размер холста. Редактирование вручную не вариант, я прямо заявил, что хочу изменить его автоматически.
Мартин Тома
Да, я знаю, что вы спрашивали об автоматизированном способе сделать это, но думали, что если бы вы могли выяснить, что изменить, с помощью текста, то вы могли бы автоматизировать это с помощью любого из множества доступных инструментов для редактирования текста (например, как sedв ответе @ тердона). Одна из проблем, с которой вы можете столкнуться, заключается в том, что значения могут отличаться от любых других файлов .svg, с которыми вы хотите сделать то же самое.
Мартино

Ответы:

15

rsvg-convertиз librsvg2-binпакета можно изменить размер SVG.

Смотрите этот ответ для полных инструкций.

серо-голубой
источник
4
rsvg-convert -a -w 500 -f svg Vector-triangle-inequality.svg -o Result.svgработал. Но rsvg-convert делает больше, чем просто изменяет размер.
Мартин Тома
2
Однако @moose, как отмечалось в этом ответе, rsvg-convert использует точки, а не пиксели. Если вам повезет, вы можете просто разделить предполагаемый размер на 1,25. Однако, если вы хотите что-то вроде 24px (19,2 в пунктах), вам не повезло, так как он не желает указывать не целое число в качестве ширины или высоты (не уверен, что SVG позволяет это).
Мэтью Флешен
@MartinThoma Да, действительно. Выходной файл SVG примерно вдвое больше исходного размера. Интересно, почему? Чтение rsvg-convert --helpне дает никаких подсказок.
Серж Строобандт
1
rsvg convert также, кажется, конвертирует заштрихованные пути в обрисованные контуры. Вы можете не хотеть этого (я знаю, что я не хочу)
scruss
1
Кажется, что этот инструмент заклинивает, превращается в каждый элемент и фактически не меняет исходные размеры.
rtaft
3

Если вы просто хотите изменить одно изображение, откройте его в текстовом редакторе (например, emacs) и измените ширину записи.

Для энтузиастов, подход только для CLI, используйте sed:

$ sed 's/width=\"146.91299pt\"/width=\"400pt\"/' orig.svg > new.svg

Это не будет масштабировать изображение, а только установить его ширину.


Возможно, лучший способ, но, безусловно, тот, который можно запустить в пакетном режиме для многих изображений, - это использовать inkscape из командной строки:

$ inkscape -z -e out.png -w 400 -h 400 in.svg

Для многих файлов (при условии, что вы хотите, чтобы все они имели одинаковую ширину), выполните следующие действия. Требуется преобразование в png и предполагается, что в именах файлов нет пробелов:

$ for n in $(ls *svg | sed 's/.svg//'); do inkscape -z -e $n.png -w 400 -h 400 $n.svg; done

Преобразование ImageMagick было моим первым выбором, но, похоже, он ломается при масштабировании svgs.

terdon
источник
7
Ваша команда inkscape приводит к появлению PNG, но я хочу SVG. Ваша команда svg изменяет только размер холста, но не размер изображения. Вы не можете просто использовать текстовый редактор и изменять только те значения, которые я упомянул выше. Я думаю, что я должен уточнить вопрос.
Мартин Тома
Вам также необходимо добавить тег: ... "> <g transform =" scale (2) "> <path .... /> </ g> </ svg>, чтобы масштабировать изображение с тем же коэффициентом.
Stofke