Как изменить размер всех изображений .svg в папке одновременно в Linux?

У меня есть несколько изображений, которые я сделал в inkscape с .svgрасширением. Эти изображения имеют разный размер (256*265, 512*512 и т.д.) в пикселях.

Как я могу изменить размер всех этих изображений сразу в Linux?

Предложение @Joonas использовать ImageMagick противоречит этому совету: избегайте использования ImageMagick для преобразования «векторного изображения» в «векторное изображение» . Inkscape будет растрировать (преобразовывать в растровое изображение): не уверен, что это все еще верно, по состоянию на 2021 год.

Ответы (2)

Я нашел решение своей проблемы, способ сделать это с помощьюrsvg-converter

и после поиска в 3W я нашел этот скрипт здесь

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

Что, если мне нужен коэффициент масштабирования вместо того, чтобы делать все SVG одинакового размера?

Не делай этого

Не зная причин вашего желания сделать это, моя первая реакция — не делать этого .

Размер SVG-файла действительно рекомендуется — он предназначен для увеличения и уменьшения размера (отсюда и масштабируемая векторная графика). Высота и ширина файла SVG для большинства практических целей не имеют значения. Если вы хотите, чтобы изображение было больше (например) на веб-странице, вы можете просто установить атрибуты высоты и ширины. Если вы экспортируете в файл PNG, вы можете установить любые размеры. Атрибуты heightи widthна самом деле даже не обязательны . Если высота или ширина не указаны для корневого <svg>элемента, по умолчанию будет установлено значение 100%.

Игра с высотой и шириной действительно упускает одно из больших преимуществ файлов SVG, а именно масштабируемость.

Но если ты действительно хочешь это сделать...

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

Файлы SVG — это просто файлы XML — вы можете открыть их в текстовом редакторе и посмотреть. Вы можете манипулировать ими так же, как и любым другим файлом XML. В Mozilla Dev Network есть фантастический справочник для изучения XML-стороны SVG-файлов.

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

Пример

Создайте текстовый файл с именем scale-svg.xsl и вставьте следующее содержимое:

<xsl:stylesheet version="1.0">
    <xsl:output method="xml"/>
    <xsl:template match="svg:svg">
        <xsl:copy>
            <xsl:copy-of select="svg:metadata|svg:defs|sodipodi:namedview"/>
            <xsl:element name="svg:g">
                <xsl:attribute name="transform">
                    <xsl:value-of select="concat(concat('scale(',$scale),')')"/>
                </xsl:attribute>
                <xsl:copy-of select="*[not(svg:metadata|svg:defs|sodipodi:namedview)]"/>
            </xsl:element>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Теперь вам нужно применить таблицу стилей к файлу SVG (или файлам). Доступно множество XSLT-программ. Если вы используете Linux, xlstprocвозможно, он уже установлен.

# This command will scale small.svg up by 3x
$ xsltproc --stringparam scale 3 scale-svg.xsl small.svg>big.svg

# This command will scale all SVG files in the current directory
$ for f in *.svg; do xsltproc --stringparam scale 3 scale-svg.xsl $f>3x_$f; done 

Если вы хотите сделать что-то другое (например, изменить высоту и ширину документа SVG, а не масштабировать его), вам потребуется изменить файл XSL в соответствии с вашими потребностями. Существует множество руководств по XSL, например, этот в W3Schools .

Есть и другие подходы, которые вы принимаете. Быстрый поиск в Google также нашел svg-resizer — подход на основе JavaScript с использованием rsvg. Вероятно, вы также можете заставить ImageMagick сделать это.

Может ли Inkscape сделать это за меня?

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

В Inkscape есть возможность автоматизировать экспорт файлов SVG разных размеров. Параметры командной строки Inkscape позволяют вручную устанавливать высоту и ширину при экспорте файла PNG.

ошибка компиляции: файл scale-svg.xsl строка 1 элемент xsl:stylesheet xsltParseStylesheetProcess: документ не является таблицей стилей
Бывают ситуации, когда некоторые утилиты командной строки (например, spritezero) конвертируют svg в растровые изображения, используя атрибуты viewBox, width и height svg, поэтому эти атрибуты (и координаты пути) не всегда являются просто предложениями.
scale-svg.xsl:1: namespace error : Namespace prefix xsl on stylesheet is not defined
«Не делайте этого» слишком широко для некоторых случаев использования. Если у Боба есть куча файлов SVG разного размера, и он передает их Алисе, то Алисе, возможно, придется вручную изменять размер каждого из них при его использовании, как это предлагается в этом ответе. Может быть гораздо проще изменить их размер с помощью сценария командной строки , чтобы Алиса могла «подключи и работай» без необходимости индивидуально изменять размер каждого из них до необходимых размеров. Вы правы, это проблема рабочего процесса, но многие рабочие процессы не изменяют размер SVG автоматически (в моем случае этого не происходит).
⚠️ Примечание. ImageMagick.org заявляет, что не может изменять размер SVG без потерь , потому что есть промежуточный этап: растеризация. См. «Кратко о форматах векторных изображений» на Imagemagick.org , но не уверен, что это все еще верно по состоянию на 2021 год.