Как преобразовать SVG в PNG с помощью Image Magick?
у меня есть файл SVG, который имеет определенный размер 16x16. Когда я использую программу конвертации Image Magick, чтобы преобразовать ее в PNG, я получаю 16x16 pixel PNG, который слишком мал:
convert test.svg test.png
мне нужно указать размер пикселя выходного PNG. -size
параметр, похоже, игнорируется,-scale
параметр масштабирует PNG после он был преобразован в PNG. Лучший результат до сих пор я получил, используя :
convert -density 1200 test.svg test.png
но я не удовлетворен, потому что я хочу указать размер вывода в пикселях, не выполняя математику для вычисления значения плотности. Поэтому я хочу сделать что-то вроде этого:
convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png
Итак, какой магический параметр я должен использовать здесь?
13 ответов
Я не смог получить хорошие результаты от ImageMagick в этом случае, но Inkscape делает хорошую работу в Linux и Windows:
inkscape -z -e test.png -w 1024 -h 1024 test.svg
вот результат масштабирования 16x16 SVG до 200x200 PNG с помощью этой команды:
просто для справки, моя версия Inkscape (на Ubuntu 12.04):
Inkscape 0.48.3.1 r9886 (Mar 29 2012)
и в Windows 7 это:
Inkscape 0.48.4 r9939 (Dec 17 2012)
попробовать svgexport:
svgexport input.svg output.png 64x
svgexport input.svg output.png 1024:1024
svgexport-это простой кросс-платформенный инструмент командной строки, который я сделал для экспорта svg-файлов в jpg и png, см. здесь дополнительные параметры. Чтобы установить svgexport установить npm, затем запустите:
npm install svgexport -g
Edit: если вы нашли проблему с библиотекой, пожалуйста представить на GitHub, спасибо!
Это не идеально, но это делает работу.
convert -density 1200 -resize 200x200 source.svg target.png
в основном это увеличивает DPI достаточно высоко (просто используйте образованное/безопасное предположение), что изменение размера выполняется с достаточным качеством. Я пытался найти правильное решение этого, но через некоторое время решил, что это достаточно хорошо для моей текущей потребности.
Примечание: используйте 200x200! форсировать данное разрешение
Если вы находитесь на 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
.
Inkscape, похоже, не работает, когда блоки svg не px
(например, cm). Я получил пустое изображение. Возможно, это можно было бы исправить, повернув dpi, но это было слишком хлопотно.
Svgexport-это узел.программа js и так не очень полезна.
преобразование Imagemagick работает нормально с:
~$ convert -background none -size 1024x1024 infile.svg outfile.png
если вы используете -resize
, изображение нечеткое, а файл намного больше.
лучшие
~$ rsvg -w 1024 -h 1024 infile.svg outfile.png
Он самый быстрый, имеет наименьшее количество зависимостей, а выход примерно на 30% меньше, чем convert. Установите librsvg2-bin, чтобы получить его. Кажется, что нет man-страницы, но вы можете ввести:
~$ rsvg --help
чтобы получить некоторую помощь. Простой хороший.
после выполнения шагов в ответ Хосе Албана, я смог заставить ImageMagick работать нормально, используя следующую команду:
convert -density 1536 -background none -resize 100x100 input.svg output-100.png
число 1536 исходит из приблизительной оценки плотности, см. ответ для получения дополнительной информации.
для масштабирования изображения следует использовать опцию-плотность. Насколько я знаю, стандартная плотность 72 и отображает размер 1: 1. Если вы хотите, чтобы выходной png был вдвое больше исходного svg, установите плотность 72*2=144
преобразовать-плотность 144 источника.цель СВГ.формат PNG
Почему бы вам не попробовать командную строку inkscape, это мой файл bat для преобразования всех svg в этом директории в png:
для %%x в (*.svg) сделать C:\Ink\App\Inkscape\inkscape - ... исполняемые %%х -з-экспорт-Т / Д=500 --экспортно-зона-чертеж --экспортно-ПНГ="%%~ПХ.png"
одна вещь, которая просто укусила меня, устанавливала -density
после имени входного файла. Это не сработало. Перемещение его в первый вариант в convert (прежде всего) заставило его работать (для меня, YMMV и т. д.).
Я пришел к этому сообщению, но я просто хотел сделать преобразование пакетным и быстрым без использования каких-либо параметров (из-за нескольких файлов с разными размерами).
rsvg drawing.svg drawing.png
для меня требования были, наверное, немного проще, чем для автора. (Хотел использовать SVGs в MS PowerPoint, но это не позволяет)
Я решил эту проблему путем изменения 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
верхний ответ @808sound не работал для меня. Я хотел изменить размер
поэтому вместо этого я открыл Inkscape, а затем пошел в File
, Export as PNG file
и появилось окно GUI, которое позволило мне установить точные размеры, которые мне нужны.
версия on Ubuntu 16.04 Linux
:
Inkscape 0.91 (September 2016)
(это изображение от Kenney.nl ' s пакеты активов кстати)
для простого преобразования SVG в PNG я нашел cairosvg (https://cairosvg.org/) работает лучше, чем ImageMagick. Шаги по установке и запуску всех SVG-файлов в каталоге.
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]