Пакетное преобразование изображений SVG в нужный размер PNG или ICO


26

У меня есть набор значков SVG, которые я хотел бы использовать для разработки приложения в VB.Net 2010, и, поскольку он не поддерживает обработку значков SVG, мне необходимо преобразовать эти значки в PNG или ICO, с предпочтением выходное разрешение. Я нашел такой инструмент командной строки для Ubuntu под названием rsvgconvert. Есть ли у нас такой инструмент для Windows?

Ответы:


12

ImageMagick имеет инструмент командной строки, который доступен для Linux и Windows (и других). Инструмент конвертера обычно называется «конвертировать». Вот некоторая документация по использованию .

И вот где вы можете получить установщик Windows .


Вы также можете получить его через подсистему Windows для Linux (WSL), с помощьюapt install imagemagick
antonyh

(это относится к linux, может относиться к windows), если вы включите -verbose для IM, тогда может показаться, что для создания промежуточного eps-файла IM использует сам inkscape. поэтому я хотел бы предложить ответ @ zetah
Northern-Bradley

Вот небольшой конвертер на основе ImageMagick для Windows: fosshub.com/SVG2PNG.html Он старый (с 2014 года), но все еще работает, и вам не нужно читать никаких документов.
день,

20

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

Лучше попробуйте Inkscape в командной строке:

inkscape in.svg --export-png=out.png


8
Почему вы говорите, что Inkscape лучше, чем ImageMagick? Я не согласен (или согласен), просто интересно узнать больше.
Сэм

Причина в том, что imageMagick подходит для лучшей обработки png, jpg и т. Д., В то время как inkscape лучше подходит для обработки векторных изображений (svg)
user93

1
В нынешнем виде это не отвечает на вопрос о пакетном преобразовании, не так ли?
ИЛИ Mapper

В то время как ответ работает, в Windows InkScape настаивает на том, чтобы с заставкой отображался заставочный экран с захватом фокуса, что делает невозможным запуск этого в пакетном режиме в фоновом режиме.
Тимви

@ Тимви Этого здесь не происходит. Просто не забудьте использовать -zопцию.
Svish

5

Командная строка не работала из коробки, плюс я хотел, чтобы 100 файлов были конвертированы. Вот как я сделал это работает с Windows 7:

  1. установить Inkscape - не портативный!

  2. Скопируйте все ваши SVG-файлы в одну папку, например, "C: \ svgs \" там:

  3. вы создаете convert.batфайл с этой строкой внутри:

    FOR %%A IN (*.svg) DO "C:\Program Files (x86)\Inkscape\inkscape.exe" --export-png=%%A.png
    

    (укажите правильную папку вашей установки):

  4. откройте CMD как администратор! Для этого нажмите клавишу WIN, введите cmd, щелкните правой кнопкой мыши «cmd.exe» и выберите «Запуск от имени администратора».

  5. перейдите к своему "C: \ svgs \" и введите convert.bat - Все svg-файлы будут преобразованы в PNG.

  6. Используйте проводник Windows для поиска преобразованных файлов PNG. На моем ПК они были в папке:C:\Users\myname\AppData\Local\VirtualStore\Program Files (x86)\Inkscape\svgs

Надеюсь, это поможет.


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

Вам нужно указать правильные настройки, иначе он не будет работать. Вот что я сделал:

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

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

После того, как вы нажмете «Готово», вам нужно нажать кнопку «Запустить пакетный конвертер ...» на панели инструментов:

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


1
В вашей пакетной команде, вероятно, отсутствует другая %%A(в качестве имени входного файла). Кроме того, почему вы предполагаете, что он должен работать только в режиме администратора?
ИЛИ Mapper

Так как же это лучше, чем использовать ImageMagick?
reinierpost

К сожалению, эта ссылка, кажется, тоже умерла. (август 2017)
Идеограмма

@ Идеограмма У меня есть другой поставщик загрузки. softsea.com/download/InkscapeBatch.html
Кай Ноак,

для указания dpi вам нужно добавить эту опцию, --export-dpi=100где 100-е значение dpi
Xsmael

3

InkscapeBatch выполняет работу в Windows. Требуется Inkscape .


Не работает Я попробовал это после установки Inkscape v0.91, и он говорит, что Inkscape не был найден.
Йорис Гроусман,

1
Кажется, больше не существует.
ИЛИ Mapper

альтернативная ссылка -> softsea.com/download/InkscapeBatch.html
computingfreak

3

Для преобразования SVG в PNG я обнаружил, что cairosvg ( https://cairosvg.org/ ) работает лучше, чем ImageMagick. Шаги для установки и запуска всех файлов в вашем каталоге.

pip3 install cairosvg

Откройте оболочку python в каталоге, содержащем ваши файлы .svg и запустите:

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

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

$ mv *.png [new directory]

Этот ответ - единственный, который работал для моего довольно большого файла SVG, спасибо !!!
Бен Сандин

1

После борьбы с этим в течение почти 2 часов я поселился в Inkscape. Поскольку мне нужно было конвертировать несколько файлов в разных разрешениях, я создал скрипт Powershell. С 106 SVG мой компьютер завис на 5 секунд, поэтому будьте осторожны при использовании этого.

# ENTER THE FULL PATH TO THE INKSCAPE EXECUTABLE
$inkscapeExe = "C:\Program Files\Inkscape\inkscape.exe"
# ENTER THE PATH TO THE FOLDER CONTAINING THE SVGs
$svgFolder = "C:\Images\SVG"
# ENTER THE DESIRED WIDTH
$width = 120
# ENTER THE DESIRED HEIGHT
$height = 120

$svgFiles = Get-ChildItem $svgFolder -Filter *.svg
foreach ($svgFile in $svgFiles)
{
    $inputParam  = $svgFile.FullName 
    $outputParam = "--export-png=" + $svgFile.FullName + "-" + $width + "x" + $height + ".png" 
    $widthParam  = "-w" + $width
    $heightParam = "-h" + $height

    & $inkscapeExe $inputParam $outputParam $widthParam $heightParam
}

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

Если вы поместите | Out-Nullв конец строки, которая начинается с &нее, вы заставите ее выполнить команду inkscape.exe по одной, что для меня гораздо лучше.
Рори

1

Вы можете использовать следующее в Bash / Ubuntu для Windows, в папке с SVG. Однако кажется, что ImageMagick сначала растеризует, а затем изменяет размеры, что приводит к странным артефактам ...

find -name "*.svg" -exec convert {} -background none -density 300 -resize 256x256 -define icon:auto-resize -alpha remove -colors 256 {}.ico \;

Также посмотрите вот решение на основе Inscape, которое, кажется, работает хорошо (из другого потока, ссылка потеряна): mkdir temp; declare -a res=(16 24 32 48 64 128 256); for f in *.svg; do for r in "${res[@]}"; do inkscape -z -e temp/${f}${r}.png -w $r -h $r $f; done; resm=( "${res[@]/#/temp/$f}" ); resm=( "${resm[@]/%/.png}" ); convert "${resm[@]}" ${f%%.*}.ico; done; rm -rf temp;


1
+1 Я использовал это с inkscape в очень упрощенной версии. find -name "*.svg" -exec inkscape {} -e {}.png \;Хотя я предпочитаю эту версию: ls | grep ".svg" | xargs -I file inkscape file -e file.pngпотому что файлы обрабатываются в алфавитном порядке - это не тот случай, когда используетсяfind
love.by.Jesus


0

Я не смог найти ни одной команды, которая работала бы для запуска пакета, поэтому я заставил ее работать, генерируя список файлов и создавая серию команд. Эти инструкции должны работать для всех версий Windows. Все инструкции по печатанию исключают цитаты и включают все между ними.

Для этого вам понадобится Inkscape, MS Excel или аналогичный редактор электронных таблиц и генератор списков. Здесь есть отличный генератор списков бесплатных программ: https://www.portablefreeware.com/?id=1171

  • Hardlink, скопировать или переместить все файлы SVG в одну папку.
  • Создайте список файлов этой папки и экспортируйте в csv.
  • Откройте CSV в Excel и удалите все столбцы, кроме столбца имени файла. Также удалите заголовки столбцов, такие как [Путь] и сводный текст внизу.
  • Если имена файлов еще не указаны во втором столбце, вырежьте и вставьте их туда.
  • В первой ячейке первого столбца введите inkscape, за которым следует пробел и путь к папке, в которой ваши SVG-файлы включают в себя обратную косую черту (например, «inkscape C: \ SVG \»). Затем скопируйте эту ячейку, выделите все ячейки под ней, которые предшествуют имени файла, и вставьте так, чтобы все они имели одинаковый текст.
  • В третьем столбце введите --export-png = в первой ячейке, за которой следует папка назначения, в которую вы хотите их сохранить. Я просто использовал эту же папку. Чтобы синтаксис был правильным, обязательно добавьте пробел в начале, но оставьте остальной текст вместе (например, «--export-png = C: \ PNG \»). Скопируйте и вставьте это для всех строк так же, как первый столбец
  • Скопируйте весь второй столбец и вставьте его в четвертый столбец. Выбрав четвертый столбец, нажмите Ctrl + H (Найти и заменить). В поле поиска введите «.svg». В поле замены введите «.png», затем выберите «Заменить все».

Если вы сделали это правильно, у вас должна быть одна строка для каждого имени файла, которая выглядит следующим образом: | inkscape C: \ SVG \ | Filename1.svg | --export-PNG = C: \ PNG \ | Filename1.png |

  • В первой ячейке пятого столбца введите «= сцепленный (a2, b2, c2, d2)». Это предполагает, что столбец заголовка не был удален. Номера ячеек в скобках должны соответствовать текущему номеру строки. Если ваше первое имя файла в B2, приведенная выше формула верна. В противном случае правильно, имена ячеек в скобках соответствуют первой строке имени файла (например, a1, b1, c1 ...)
  • Скопируйте и вставьте эту ячейку, чтобы заполнить все под ней, как столбцы 1 и 3.
  • Теперь скопируйте весь пятый столбец и используйте Paste Special> Values, чтобы вставить текст, созданный формулами, в шестой столбец. Эта шестая колонка - ваши деньги. Скопируйте весь шестой столбец, откройте Блокнот и вставьте последний столбец в него. Если вы сделали это правильно, у вас будет одна командная строка для преобразования каждого из ваших файлов SVG в PNG.
  • Сохраните файл «Блокнот» в каталоге Inkscape как пакетный файл. Когда откроется окно «Сохранить как», измените тип «Сохранить как» на «Все файлы» и сохраните его как файл .bat (например, «C: \ Program Files \ Inkscape \ SVGBatch.bat»).
  • Осталось только перейти в эту папку и дважды щелкнуть только что сохраненный пакетный файл. Он должен открыть командную строку и конвертировать все файлы.

Надеюсь, что это делает чью-то жизнь проще. Джеймс


0

Ответ Кая близок, но у меня не получилось. Однако, с несколькими небольшими изменениями, это сработало в первый раз:

  1. Скопируйте ваши SVG в удобное место
  2. Создайте текстовый файл в той же папке и переименуйте его convert.bat
  3. Откройте convert.batв вашем любимом текстовом / кодовом редакторе и введите следующее:

FOR %%A IN (*.svg) DO "C:\Program Files\Inkscape\inkscape.exe" %%A --export-png=%%A.png

(Обратите внимание , что inkscape.exeрасположение должно соответствовать исполняемое местоположению программы на вашем компьютере, а второй , прежде чем --export-pngэто %%A- это SVG файл , который преобразуется)

  1. Дважды щелкните, convert.batчтобы запустить, и он должен повторить результаты преобразований.

Обратите внимание, что вам может потребоваться обновить папку Windows, чтобы увидеть новые файлы, но все они должны были быть созданы в том же месте, что и исходные SVG.


0

По какой-то причине мне не удалось заставить работать imagemagick или inkscape. У меня было всего 12 файлов для конвертации, я просто использовал этот сайт вручную: http://svgtopng.com/ работал с удовольствием.


0

Вот решение на основе ImageMagick для преобразования всех файлов SVG в данном каталоге в файлы ICO:

mogrify -format ico -density 1200 -background transparent -trim -resize 256x256 -gravity center -extent 256x256 -define icon:auto-resize *.svg

Объяснение:

  • mogrify: Нравится convert, но позволяет пакетно обрабатывать несколько файлов.
  • -format ico: Наш целевой формат файла. Создает .icoфайлы вместо перезаписи исходного файла (как mogrify будет делать по умолчанию).
  • -density 1200: Поскольку мы не можем указать целевой размер пикселя, в который ImageMagick должен растеризовать SVG (сначала он будет растеризован с плотностью по умолчанию, а затем масштабирован), мы растеризуем SVG с безумно высоким разрешением (1200 точек на дюйм), чтобы гарантировать, что изображение будет уменьшено до 256x256 вместо увеличенного.
  • -background transparent: Фон будет отображаться как прозрачный.
  • -trim: Удалить существующую рамку вокруг изображения.
  • -resize 256x256: Масштабируйте изображение, обеспечивая максимальную длину 256 пикселей, сохраняя соотношение сторон.
  • -gravity center -extent 256x256: Увеличьте холст, убедившись, что у короткой стороны также есть 256px. Существующее изображение выровнено по центру. Это необходимо, потому что нам нужно квадратное изображение в качестве основы для файла ICO.
  • -define icon:auto-resize: Включите в файл ICO не только изображение 256x256, но и все рекомендуемые уменьшенные разрешения (например, 32x32).

0

Большинство ответов, приведенных здесь, игнорируют нужную часть вопроса. Я не мог получить удовлетворительные результаты, используя convert"масштабирование" SVG. inkscapeделает лучшую работу, а также сохраняет прозрачность фона.

В зависимости от вашего варианта использования, используйте один из следующих вариантов:

  1. экспорт с указанным DPI: inscape in.svg -d 300 -e out.png
  2. экспорт с заданной шириной (с сохранением пропорций): inscape in.svg -w 800 -e output.png
  3. экспорт на заданную высоту (с сохранением пропорций): inscape in.svg -h 600 -e output.png

Обратите внимание, что указание ширины и высоты не сохраняет соотношение сторон.

Чтобы преобразовать сразу несколько файлов, настройте следующие параметры в соответствии с вашим вариантом использования ( bashсовместимым или совместимым):

for f in *.svg; do
  inkscape $f -d 300 -e ${f%.*}.png
done
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.