Подтвердить что ты не робот

Преобразование и изменение размера SVG в PNG

Я пытаюсь преобразовать SVG в PNG (или любой растровый формат) и изменить размер в одно и то же время.

Я думал, что для этой задачи я бы использовал ImageMagick, но, похоже, она преобразуется в растровое изображение до изменения размера.

В результате получается изображение низкого качества.

  • Есть ли способ заставить ImageMagick изменить размер SVG до преобразования в растровый?

  • Или есть ли другой инструмент, который я могу использовать для программного преобразования SVG в растр после его изменения?

  • В качестве альтернативы, есть ли другой инструмент, который я мог бы использовать для этого?

В настоящее время я использую ImageMagick через командную строку:

convert file.svg -resize 100x100 file.png

Размер изображения исходного изображения неизвестен, а размер назначения неизвестен до времени выполнения.

4b9b3361

Ответ 1

SVG определяется как вектор, а не растровое изображение - с которым ИМ любит общаться. Когда IM читает вектор, он не знает размер, поэтому, когда вы это сделаете:

convert compass.svg -resize 1000x1000 compassB.jpg

он создает холст растрового размера по умолчанию, "рисует" вектор на нем, затем изменяет его размер и сохраняет его как JPEG. В результате, если ваш предполагаемый размер больше холста, который IM "угадал", является низким качеством - он не может создавать информацию, которую он больше не имеет в результате растеризации изображения на слишком маленьком холсте.

enter image description here

Решение состоит в том, чтобы сообщить IM вверх, что вектор нужно нарисовать на большой холст, до он растеризует:

convert -size 1000x1000 compass.svg compassA.jpg

enter image description here

Ответ 2

Так я это делаю и, похоже, работает.

convert -background none -density 1000 -resize 1000x compass.svg compass.png

Здесь каждая часть.

  • Используйте -background none, чтобы убедиться, что прозрачные части SVG остаются прозрачными и не заполняются белым цветом.
  • Поскольку ImageMagick работает только с растровыми изображениями, вам нужно использовать -density 1000 и указать ширину, по которой вы хотите изменить размер SVG. Таким образом, когда вы на самом деле вызываете команду resize, растровое представление загруженного SVG будет уже иметь ширину 1000, иначе вы в конечном итоге измените размер растра вверх или вниз по сравнению с исходным размером изображения SVG.
  • Теперь используйте -resize 1000x, чтобы дать вашему SVG новую ширину, высота будет автоматически рассчитана для сохранения пропорции.

Одна из ошибок заключается в том, что я действительно не знаю, как вы можете изменить размер на основе высоты и позволить вычислять ширину, поскольку -density применяется к ширине, а не по высоте. Таким образом, вам нужно будет знать фактическое соотношение вашего SVG заранее и работать с шириной соответственно.

Ответ 3

Я сделал svgexport для этого:

svgexport file.svg file.png 100:100

Ответ 4

Итак, получается, что inkscape имеет интерфейс командной строки.

К сожалению, аргументы -w и -h для inkscape не сохраняют соотношение сторон. Однако он обеспечивает способ запроса текущей ширины и высоты - но только по одному.

Итак, решение состоит в том, чтобы запустить inkscape не менее 3 раз.

inkscape -f svgfile.svg -W
<read stdin into some variable>
inkscape -f svgfile.svg -H
<read stdin into some variable>
<calculate aspect ratio and apply logic to retain aspect for new size>
inkscape -f svgfile.svg -w <newwidth> -h <newheight> -e file.png

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

Выполнение всего этого с С# является громоздким, если не сказать больше, поэтому этот вопрос остается открытым для лучшего решения.

Ответ 5

Нечетно, что ImageMagick будет отображать один размер, а затем масштабировать растровое изображение. Если, то есть, SVG имеет определенный размер, определенный в нем. Проверьте атрибуты width и height файлов SVG, которые вы используете. Попробуйте изменить ширину и высоту на 100% и посмотрите, не изменилось ли это.

<svg width="100%" height="100%" ...etc...>

(Предположим, что у вас есть контроль над файлами SVG, которые вы используете).