Как конвертировать SVG в PNG с помощью Image Magick? - PullRequest
335 голосов
/ 24 марта 2012

У меня есть файл 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

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

Ответы [ 13 ]

1 голос
/ 12 мая 2018

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

Я решил эту проблему, изменив атрибуты 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
0 голосов
/ 07 сентября 2016

Лучший ответ от @ 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 , кстати)

...