2013-08-12 5 views
22

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

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

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

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

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

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

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

convert file.svg -resize 100x100 file.png 

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

+0

Покажите нам команду, которую вы выдаете – Tarik

+0

@Tarik Я добавил неверную строку cmdline – DJL

+0

@ Ответ MarkSetchell правильный. Вам нужно установить размер холста вверх в командной строке. Более подробную информацию о структуре и порядке своих аргументов в ImageMagick см. В разделе ** [«Порядок опций командной строки ImageMagick (и категории параметров командной строки)»] (http://stackoverflow.com/a/26940206/359307) **. –

ответ

0

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

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

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

+0

Это интересное решение. Я не пробовал, потому что теперь я решил проблему другим способом (хотя и довольно запутанным). Ответ придет через несколько минут. К сожалению, у меня нет контроля над исходными SVG. – DJL

3

Так получилось, что 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 для выполнения дополнительных операций.

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

+0

спасибо, только решение, которое сработало для меня –

6

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

svgexport file.svg file.png 100:100 
+0

Это на самом деле хороший инструмент. Отлично сработано! –

26

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

convert compass.svg -resize 1000x1000 compassB.jpg 

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

enter image description here

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

convert -size 1000x1000 compass.svg compassA.jpg 

enter image description here

+0

Это имеет большой смысл. Я посмотрю, спасибо – DJL

+0

@DJL: Это правильный ответ. Если вы не согласны с этим, по крайней мере, пожалуйста, повысьте его! –

+0

@ KurtPfeifle, как только у меня был шанс проверить это. Вопрос был первоначально задан 6 месяцев назад. С тех пор я перешел к другим вещам. – DJL

22

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

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 новую ширину, высота будет рассчитываться автоматически, чтобы сохранить соотношение сторон.

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

+1

FWIW это отлично сработало для меня. –

+0

Работает очень хорошо. – Oliver

+0

работает как шарм – liudanking

Смежные вопросы