В Inkscape одновременно изменяйте размер документа и его содержимого.

Я изо всех сил пытался сделать что-то, что казалось бы довольно простым:

Как в Inkscape изменить размер документа и его содержимого (например, рисунков) одновременно?

Немного контекста: я хочу изменить размер довольно большого количества документов SVG из The Noun Project (обычно это документы размером 100x100px) без необходимости явного изменения размера реальных рисунков.

NB: Если есть решение для командной строки, я тоже могу с ним работать!

Я не уверен в вашей конечной цели, но, насколько я знаю, область документа несколько произвольна, кроме печати, где у вас есть возможность распечатать только область документа. Однако вы также можете распечатать только область объекта, так что это может быть способом обойти ваше препятствие.
@ DA01 Ну, я думаю, что документ очень полезен при экспорте в растровое изображение (что я и делаю).
Кстати, есть ли способ изменить размер объекта, который не требует перетаскивания углов, но где вы явно указываете размер? Это может быть то, что я после :)
даже тогда это произвольный вариант. Вы можете так же легко нарисовать содержащую коробку, как и вашу экспортную «зону». Собственно, именно так я обычно и предпочитаю делать. Что касается изменения размера, вы можете выбрать свои объекты, а затем либо а) использовать строку состояния вверху и ввести изменения размера, либо б) перейти в ОБЪЕКТ > ПРЕОБРАЗОВАТЬ и ввести значения в палитре преобразования.
@julien_c: Я думаю, что дело здесь в том, что объекты представляют собой прямую векторную графику и не имеют размера как такового , пока вы не выведете их на растровое устройство (или в файл). Их размер (дюймы, пиксели, локти), по сути, не имеет значения.
@horatio Я не согласен. Когда вы растрируете в пиксели, вы заботитесь о размерах ваших векторных объектов относительно этих пикселей (иначе зачем вообще реализовывать пиксельную сетку?)
Я не вижу ни фразы «пиксельная сетка», ни упоминания об ограничении в вашем вопросе. Кроме того, мое понимание пиксельных сеток заключается в том, что это не явное свойство, а скорее метод подсказок в процессе растеризации.

Ответы (5)

Вы не указали, какая у вас ОС. Я использую Ubuntu, и мне удалось успешно использовать librsvg2.

Если у вас есть доступ к Ubuntu, вот что вы можете сделать. Сначала установите librsvg2:

sudo apt-get install librsvg2-bin

Затем cdперейдите в каталог с вашими SVG (убедитесь, что в нем есть только SVG!) и используйте следующую команду:

for old in *; do
    new="$(echo "$old" | sed -e 's/svg$/new.svg/')"
    rsvg-convert "$old" -w 160 -h 160 -f svg -o "$new"
done

Это создаст новую партию SVG с размерами 200 на 200 пикселей и сохранит ее как «original-file-name.new.svg».

Расчет размеров несколько сбивает с толку. Для преобразования SVG в SVG вам нужно немного посчитать. Параметры «высота» и «ширина» в rsvg-convert используют pt, а не px в таких случаях, поэтому используйте 80, если вы хотите 100 пикселей, 120, если вы хотите 150 пикселей, и так далее.

Вы также можете использовать rsvg-convert для вывода PNG. Это намного лучше растрирует файл, чем ImageMagick, по крайней мере, по моему опыту. Обратите внимание, что вам нужно изменить -fна png, вам нужно изменить шаблон сохранения вывода с 's/svg$/new.svg/'на 's/svg$/png/', и вы вводите ширину и высоту, которые вы хотите, как значения в пикселях.

for old in *; do
    new="$(echo "$old" | sed -e 's/svg$/png/')"
    rsvg-convert "$old" -w 200 -h 200 -f png -o "$new"
done
Кстати, я просто предполагаю, что вам нужно сделать это в пакетном режиме для большого количества SVG. Если нет, вы все равно можете использовать метод rsvg-convertкак таковой: rsvg-convert noun_project_1576.svg -w 320 -h 160 -f svg -o noun_project_1576-skewed.svgкоторый возьмет исходный файл с именем «noun_project_1576», искажает его до размера 400 на 200 пикселей и переименовывает его в «noun_project_1576-skewed».
@julien_c, просто продолжаю: вы пробовали это предложение и вам повезло?
Скопируйте и вставьте код в терминал, но верните sed: -e выражение #1, char 14: unterminted 's' command Отсутствует аргумент для -o... Любые предложения
Я изменил ` на ", и теперь я получаю сообщение об ошибке сохранения в файл: echo svgfile.svg | sed -e 's/svg$/2.svg'
Отлично, будет еще лучше, когда librsvgисправят ошибку 's flowed text...
Используйте rsvg-convert v2.40.20 в Windows 10 здесь. При преобразовании из SVG в SVG rsvg-convert ошибочно добавляет суффикс значения PT (точка) внутри SVG. Пример: rsvg-convert "attachment-12.svg" -w 32 -h 32 -f svg -o "attachment-12-new.svg"Теперь мой новый SVG имеет такой заголовок: <svg ... xmlns:xlink="http://www.w3.org/1999/xlink" width="32pt" height="32pt" viewBox="0 0 32 32" version="1.1">Указание pxв преобразовании не действует. На самом деле в моей версии ошибки rsvg-convert, если вы добавите pxспецификатор единицы измерения. Какой впечатляющий провал. Кто-нибудь знает обходной путь?

В настоящее время в Inkscape нет собственного способа сделать это. Единственный способ — изменить размер содержимого и документировать отдельно.

Хотя есть несколько способов сделать это, как указано здесь, один из способов, который может работать очень хорошо, — это использовать файл viewBox. Вы просто изменяете содержимое тега SVG следующим образом:

<svg
 width="1280"
 height="800"
 viewBox="0 0 1280 800">
    <!-- More markup... --!>
</svg>

Что viewBoxделает, так это определяет внутреннюю систему координат для документа. Затем вы можете легко масштабировать документ, просто изменяя атрибуты widthи по мере необходимости.height

Однако обратите внимание, что есть некоторые недостатки. Во-первых, это работает только в определенных контекстах, особенно если вы каким-то образом напрямую включаете документ SVG на свою страницу разметки. Использование <img>тега с этим может привести или не привести к неожиданным результатам. Вам придется провести собственное исследование, чтобы выяснить, как лучше всего это сделать.

Это не работает для меня, и я не понимаю, почему. Если я отредактирую ширину и высоту, но оставлю viewBox как есть: когда Chrome отображает необработанный файл svg, он показывает только небольшую часть содержимого. Когда Inkscape отображает его, он показывает весь контент, но он намного больше, чем страница, которая представляет собой ту же маленькую (вверху слева) часть, которую показал Chrome. Итак, в целом: контент не масштабируется в соответствии с координатами окна просмотра. В моем SVG есть несколько дочерних элементов svg, но все они преобразованы на основе (я полагаю) координат окна просмотра.
У меня работало в Inkscape 0.92.3, Firefox 66 и Chromium 73.
@CPBL Я ничего не знаю о формате SVG, но я бы предположил, что поле просмотра буквально именно так: поле, через которое просматривается контент. Если вы сделаете его меньше содержимого, содержимое будет обрезано (за исключением Inkscape, вы увидите содержимое, даже если оно находится за пределами страницы). Чего вы ожидали?

Я искал способ сделать это, и я привык использовать блокнот ++ для не совсем похожих вещей, но вроде так казалось, используя обычный поиск / замену, я мог изменить «в файлах» или открыть их все, если не тысячи, и найти свой рост и ширина, которая для меня составляла 100 пикселей, но окно просмотра было немного более раздражающим, поскольку значки из thenounproject имели разные значения, выполняя замену поиска с использованием выражений регулярных выражений в первую очередь для обычных чисел.

Найдите что: viewBox=\"[\d ]*\"заменить viewBox="0 0 512 512"на (или на то, что вы хотите, чтобы числа были).

Затем были некоторые еще более раздражающие числа с десятичными точками, например, 96,987 (метатели), так что

Найдите что: viewBox=\"[\d. ]*\"Замените на: viewBox="0 0 512 512" (или любые числа, которые вы хотите видеть)

Вероятно, это не традиционный способ изменения свойств изображения, но SVG - это XML-файлы, по сути, как я знаю, это заняло около 5 минут, чтобы найти замену строк внутри кавычек и 5 минут, чтобы сделать это в блокноте ++. Надеюсь, это может помочь кому-то.

Порекомендуйте сделать резервную копию ваших файлов, прежде чем делать что-либо из вышеперечисленного, так как нет простого способа отменить, если вы запутались (или вообще, если вы меняете «в файлах»).

Что я сделал, так это сначала изменил ширину и высоту, умножив их на 10 в свойствах документа,

Свойства документа

Затем перейдите в «Правка»> «Редактор XML» и добавьте масштаб преобразования (10, 10) к корневому элементу,

XML-редактор

Затем нажмите, например, на «Путь»> «Объединение», чтобы Inkscape действительно применил конкретное преобразование к пути.

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