У меня есть SVG-файл, который имеет определенный размер 16x16. Когда я использую программу ImageMagick для преобразования его в 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
Так какой же волшебный параметр я должен здесь использовать?
Мне не удалось добиться хороших результатов от ImageMagick в этом случае, но Inkscape отлично справляется с этой задачей в Linux и Windows:
inkscape -z -e test.png -w 1024 -h 1024 test.svg
Вот результат масштабирования SVG 16x16 в PNG 200x200 с помощью этой команды:
Для справки, моя версия 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 install svgexport -g
Редактировать: если вы нашли проблему с библиотекой, пожалуйста, представить на GitHub, спасибо!
Это не идеальный вариант, но он справляется со своей задачей.
convert -density 1200 -resize 200x200 source.svg target.png
В основном он увеличивает DPI достаточно высоко (просто используйте обоснованное/безопасное предположение), чтобы изменение размера происходило с достаточным качеством. Я пытался найти подходящее решение для этого, но через некоторое время решил, что это достаточно хорошо для моих текущих потребностей.
Примечание: Используйте 200x200! для принудительного использования заданного разрешения
Если вы находитесь на MacOS X и возникли проблемы с ImageMagick'ы конвертировать, можно попробовать переустановить его с RSVG Либ. С Помощью Доморощенного:
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 не'т, кажется, работают, когда подразделения СВГ не Военторга
(например, см). Я получил пустое изображение. Может быть, она может быть установлена сложа Дои, но это было слишком хлопотно.
Svgexport программа Node.js и так, как правило, не полезно.
Пакета ImageMagick'ы преобразования работает нормально с:
~$ convert -background none -size 1024x1024 infile.svg outfile.png
Если вы используете размер
, изображение нечеткое и файл намного больше.
Лучший
~$ rsvg -w 1024 -h 1024 infile.svg outfile.png
Он быстрый, имеет меньше зависимостей, а выход составляет около 30% меньше, чем конвертировать. Установите librsvg2-Бен, чтобы получить его. Там не кажется, быть Man-страница, но вы можете набрать:
~$ rsvg --help
чтобы получить некоторую помощь. Простой хороший.
После описанных в Хосе Албан'ы ответ, я был в состоянии получить ImageMagick для работы просто отлично, используя следующую команду:
convert -density 1536 -background none -resize 100x100 input.svg output-100.png
Число 1536 исходит от приблизительные оценки плотности, см. Этот ответ для получения дополнительной информации.
Для того, чтобы изменять масштаб изображения, функция плотности должна быть использована. Насколько я знаю, стандартная плотность составляет 72 и карты размер 1:1. Если вы хотите, чтобы выходной формат PNG должен быть в два раза больше оригинальной СВГ, плотность 72*2=144:
convert -density 144 source.svg target.png
Почему бы вам не попробовать командную строку inkscape, это мой bat-файл для преобразования всех svg в этом каталоге в png:
FOR %%x IN (*.svg) DO C:\Ink\App\Inkscape\inkscape.exe %%x -z --export-dpi=500 --export-area-drawing --export-png="%%~nx.png"
Я пришел на этот пост, но я просто хотел сделать преобразование партии и быстро без использования каких-либо параметров (в силу ряда файлов с различными размерами).
rsvg drawing.svg drawing.png
Для меня требования были, вероятно, немного проще, чем для автора. (Хотел использовать Свгс в MS PowerPoint, но это вовсе'т позволить)
При помощи ImageMagick, получается лучше в SVG рендеринга, если один использует Inkscape или RSVG с ImageMagick, чем свой собственный внутренний MSVG/XML по просмотру. RSVG-это делегат, который должен быть установлен с ImageMagick. Если в Inkscape установлен на системы, пакета ImageMagick будет использовать его автоматически. Я использую Inkscape в форматы ниже.
Там нет "Магия" и параметр, который будет делать то, что вы хотите.
Но, можно вычислить очень просто точные плотность, необходимую для визуализации выходных данных.
Здесь находится небольшая кнопка 50х50 при отображении на плотность по умолчанию 96:
convert button.svg button1.png
Предположим, что мы хотим на выходе будет 500. Вход 50 по плотности по умолчанию 96 (старые версии в Inkscape можно используя 92). Так что вы можете вычислить необходимую плотность пропорционально соотношению размеров и плотностей.
512/50 = X/96
X = 96*512/50 = 983
<БР>
convert -density 983 button.svg button2.png
В ImageMagick для 7, Вы можете делать вычисления в строке следующим образом:
magick -density "%[fx:96*512/50]" button.svg button3.png
or
in_size=50
in_density=96
out_size=512
magick -density "%[fx:$in_density*$out_size/$in_size]" button.svg button3.png
Для простой SVG в PNG преобразования я нашел cairosvg (https://cairosvg.org/) работает лучше, чем с файлами. Шаги для установки и работает на всех 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]
Без librsvg, вы можете получить черный ПНГ/формате JPEG. Мы должны установить librsvg
, чтобы преобразовать
SVG-файл с помощью ImageMagick.
`` судо apt-получить установку пакета ImageMagick librsvg преобразования плотности теста 1200.тест СВГ.ПНГ
``
`` самогон установки пакета ImageMagick librsvg преобразования плотности теста 1200.тест СВГ.ПНГ
``
Я'вэ решить эту проблему через изменение атрибутов ширина
и высота
в в `<СВГ и GT; тег, чтобы соответствовать предполагаемого размера продукции и дальнейшее ее преобразование используя ImageMagick. Работает как шарм.
Здесь's в моей 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
, `экспортировать как PNG-файл, а графический интерфейс, окно выскочило, что позволило мне установить точные размеры мне нужны.
Версия на базе Ubuntu 16.04 в Linux:
В Inkscape 0.91 (Сентябрь 2016)
(Этот образ от Кенни.НЛ'пакеты с активами кстати)