it-swarm.com.ru

Как конвертировать SVG в PNG с помощью Image Magick?

У меня есть файл SVG, который имеет определенный размер 16x16. Когда я использую программу преобразования Image Magick для преобразования в PNG, я получаю PNG размером 16x16 пикселей, который слишком мал:

convert test.svg test.png

Мне нужно указать размер пикселя выходного PNG. Параметр -size, похоже, игнорируется, параметр -scale масштабирует PNG после он был преобразован в PNG. Лучший результат до сих пор я получал при использовании параметра -density:

convert -density 1200 test.svg test.png

Но я не удовлетворен, потому что я хочу указать выходной размер в пикселях без математических вычислений для вычисления значения плотности. Поэтому я хочу сделать что-то вроде этого:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

Так какой магический параметр я должен использовать здесь? 

301
kayahr

Мне не удалось получить хорошие результаты от ImageMagick в этом случае, но Inkscape отлично справляется с этой задачей на Linux и Windows:

inkscape -z -e test.png -w 1024 -h 1024 test.svg

Вот результат масштабирования SVG 16x16 до PNG 200x200 с помощью этой команды:

enter image description here

enter image description here

Просто для справки, моя версия Inkscape (на Ubuntu 12.04):

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

а в Windows 7 это:

Inkscape 0.48.4 r9939 (Dec 17 2012)
399
808sound

Попробуйте svgexport :

svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024

svgexport - это простой кроссплатформенный инструмент командной строки, который я создал для экспорта файлов svg в jpg и png, см. здесь для получения дополнительных опций. Чтобы установить svgexport установите npm , затем запустите:

npm install svgexport -g

Правка: Если вы обнаружите проблему с библиотекой, пожалуйста отправьте ее на GitHub, спасибо!

107
Ali Shakiba

Это не идеально, но это делает работу.

convert -density 1200 -resize 200x200 source.svg target.png

В основном это увеличивает DPI достаточно высоко (просто используйте обоснованное/безопасное предположение), что изменение размера выполняется с адекватным качеством. Я пытался найти правильное решение для этого, но через некоторое время решил, что это достаточно хорошо для моей текущей потребности.

Примечание: Используйте 200x200! заставить данное разрешение

87
Hardev

Если вы работаете в MacOS X и у вас есть проблемы с конвертированием Imagemagick, вы можете попробовать переустановить его с помощью RSVG lib . Используя HomeBrew:

brew remove imagemagick
brew install imagemagick --with-librsvg

Убедитесь, что он делегирует правильно:

$ convert -version
Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-12-17 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC
Features: DPC Modules
Delegates: bzlib cairo fontconfig freetype jng jpeg lcms ltdl lzma png rsvg tiff xml zlib

Должен отображаться rsvg.

50
Jose Alban

Inkscape, похоже, не работает, когда svg-единицы не являются px (например, cm). Я получил пустое изображение. Может быть, это можно исправить, повернув dpi, но это было слишком хлопотно.

Svgexport - это программа node.js, поэтому она обычно не используется.

Преобразование Imagemagick работает нормально с:

 ~$ convert -background none -size 1024x1024 infile.svg outfile.png

Если вы используете -resize, изображение будет размытым, а файл станет намного больше.

ЛУЧШИЙ

~$ rsvg  -w 1024 -h 1024 infile.svg  outfile.png

Он самый быстрый, имеет наименьшее количество зависимостей, а вывод примерно на 30% меньше, чем конвертирование. Установите librsvg2-bin, чтобы получить его. Похоже, что это не страница руководства, но вы можете ввести:

~$ rsvg --help

чтобы получить некоторую помощь. Простое это хорошо.

26
september_converter

Выполнив шаги, описанные в Jose Alban's answer , я смог заставить ImageMagick нормально работать, используя следующую команду: 

convert -density 1536 -background none -resize 100x100 input.svg output-100.png

Число 1536 исходит из приблизительной оценки плотности, см. Этот ответ для получения дополнительной информации.

15
Ian

Чтобы изменить масштаб изображения, следует использовать параметр -density. Насколько я знаю, стандартная плотность составляет 72, а карты размером 1: 1. Если вы хотите, чтобы выходной png был в два раза больше исходного svg, установите плотность на 72 * 2 = 144:

convert -density 144 source.svg target.png
11
Stanislav Schmidt

почему бы вам не попробовать inkscape в командной строке, это мой bat файл для конвертации всех svg в этом dir в png:

FOR %% x IN (* .svg) DO C:\Ink\App\Inkscape\inkscape.exe %% x -z --export-dpi = 500 --export-area-drawing --export-png = "% % ~ nx.png» 

6
ampecs

Я пришел к этому сообщению - но я просто хотел сделать преобразование пакетным и быстрым без использования каких-либо параметров (из-за нескольких файлов с разными размерами). 

rsvg drawing.svg drawing.png

Для меня требования были, вероятно, немного проще, чем для первоначального автора. (Хотел использовать SVG в MS PowerPoint, но это не позволяет)

3
Qohelet

Одна вещь, которая меня просто поразила, это установка -density ПОСЛЕ имени входного файла. Это не сработало. Перемещение его к первому параметру в convert (прежде всего) заставило его работать (для меня, YMMV и т.д.).

2
Nick

Я решил эту проблему, изменив атрибуты width и height тега <svg> в соответствии с моим предполагаемым размером вывода, а затем преобразовав его с помощью ImageMagick. Работает как шарм.

Вот мой код Python, функция, которая будет возвращать содержимое файла JPG:

import gzip, re, os
from ynlib.files import ReadFromFile, WriteToFile
from ynlib.system import Execute
from xml.dom.minidom import parse, parseString


def SVGToJPGInMemory(svgPath, newWidth, backgroundColor):

    tempPath = os.path.join(self.rootFolder, 'data')
    fileNameRoot = 'temp_' + str(image.getID())

    if svgPath.lower().endswith('svgz'):
        svg = gzip.open(svgPath, 'rb').read()
    else:
        svg = ReadFromFile(svgPath)

    xmldoc = parseString(svg)

    width = float(xmldoc.getElementsByTagName("svg")[0].attributes['width'].value.split('px')[0])
    height = float(xmldoc.getElementsByTagName("svg")[0].attributes['height'].value.split('px')[0])

    newHeight = int(newWidth / width * height) 

    xmldoc.getElementsByTagName("svg")[0].attributes['width'].value = '%spx' % newWidth
    xmldoc.getElementsByTagName("svg")[0].attributes['height'].value = '%spx' % newHeight

    WriteToFile(os.path.join(tempPath, fileNameRoot + '.svg'), xmldoc.toxml())
    Execute('convert -background "%s" %s %s' % (backgroundColor, os.path.join(tempPath, fileNameRoot + '.svg'), os.path.join(tempPath, fileNameRoot + '.jpg')))

    jpg = open(os.path.join(tempPath, fileNameRoot + '.jpg'), 'rb').read()

    os.remove(os.path.join(tempPath, fileNameRoot + '.jpg'))
    os.remove(os.path.join(tempPath, fileNameRoot + '.svg'))

    return jpg
1
Yanone

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

pip3 install cairosvg

Откройте python Shell в каталоге, который содержит ваши файлы .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]
0
edank

Лучший ответ от @ 808sound не сработал для меня. Я хотел изменить размер  Kenney.nl UI Pack

и получил  Kenney UI Pack messed up

Поэтому вместо этого я открыл Inkscape, затем перешел к File, Export as PNG file, и всплыло окно с графическим интерфейсом, которое позволило мне установить точные размеры, которые мне нужны.

Версия на Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(Это изображение из пакеты ресурсов Kenney.nl кстати)

0
James L.