Преобразование и изменение размера SVG в PNG
Я пытаюсь преобразовать SVG в PNG (или любой растровый формат) и изменить размер в одно и то же время.
Я думал, что для этой задачи я бы использовал ImageMagick, но, похоже, она преобразуется в растровое изображение до изменения размера.
В результате получается изображение низкого качества.
-
Есть ли способ заставить ImageMagick изменить размер SVG до преобразования в растровый?
-
Или есть ли другой инструмент, который я могу использовать для программного преобразования SVG в растр после его изменения?
-
В качестве альтернативы, есть ли другой инструмент, который я мог бы использовать для этого?
В настоящее время я использую ImageMagick через командную строку:
convert file.svg -resize 100x100 file.png
Размер изображения исходного изображения неизвестен, а размер назначения неизвестен до времени выполнения.
Ответы
Ответ 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, которые вы используете).