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



у меня есть SVG-файл, который имеет определенный размер 16x16. Когда я использовать изображения Магике преобразовать программу, чтобы конвертировать его в PNG-файл, Затем я получаю 16х16 пикселей 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


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

848   13  

13 ответов:

Я не смог получить хорошие результаты от ImageMagick в этом случае, но Inkscape делает хорошую работу на Linux и Windows:

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

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

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)

попробовать 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. Использование Доморощенного:

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 не похоже на работу, когда подразделения СВГ не px (например, см). Я получил пустое изображение. Возможно, это можно было бы исправить, повернув 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, чтобы получить его. Там, кажется, нет справочной страницы, но вы можете ввести:

~$ 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 IN (*.svg) DO 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 не работал для меня. Я хотел изменить размер Kenney.nl UI Pack

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

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

версии Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(это изображение от Kenney.nl ' s asset packs кстати)

для простого преобразования 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]

Comments

    Ничего не найдено.