Wie konvertiere ich mit ImageMagick ein SVG in ein PNG?


388

Ich habe eine SVG-Datei mit einer definierten Größe von 16x16. Wenn ich das Konvertierungsprogramm von ImageMagick verwende, um es in ein PNG zu konvertieren, erhalte ich ein PNG mit 16 x 16 Pixeln, das viel zu klein ist:

convert test.svg test.png

Ich muss die Pixelgröße des Ausgabe-PNG angeben. -sizeParameter scheint ignoriert zu werden, -scaleParameter skaliert das PNG, nachdem es in PNG konvertiert wurde. Das bisher beste Ergebnis habe ich mit dem -densityParameter erzielt:

convert -density 1200 test.svg test.png

Ich bin jedoch nicht zufrieden, da ich die Ausgabegröße in Pixel angeben möchte, ohne den Dichtewert zu berechnen. Also möchte ich so etwas machen:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

Was ist der magische Parameter, den ich hier verwenden muss?


6
zB -size 1024x1024funktioniert gut, was ist deine Imagemagick-Version?
Dejan Marjanovic


2
ImageMagick-6.9.0-Q16. convert -resize 1024x1024 foo.svg foo.png funktioniert einwandfrei.
Jichao

11
@Jichao -resizestreckt nur das konvertierte Bild mit Ergebnissen von schlechter Qualität.
Elist

5
convert -size 1024x1024 test.svg test.pngfunktioniert gut mit ImageMagick 7.0.7-0 Q16 (aktuelle Version in Chocolatey Repo für Windows). -sizeStellen Sie einfach sicher, dass dies vor dem eingegebenen Dateinamen angezeigt wird. Andernfalls wird ein 16x16-Bild hochskaliert, um ein verschwommenes Ergebnis zu erzielen.
Futal

Antworten:


502

In diesem Fall konnte ich mit ImageMagick keine guten Ergebnisse erzielen, aber Inkscape leistet unter Linux und Windows gute Arbeit:

inkscape -z -w 1024 -h 1024 input.svg -e output.png

Bearbeiten (Mai 2020): Inkscape 1.0-Benutzer beachten Sie, dass sich die Befehlszeilenargumente geändert haben:

inkscape -w 1024 -h 1024 input.svg --export-filename output.png

Hier ist das Ergebnis der Skalierung eines 16x16-SVG auf ein 200x200-PNG mit diesem Befehl:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Nur als Referenz ist meine Inkscape-Version (unter Ubuntu 12.04):

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

und unter Windows 7 ist es:

Inkscape 0.48.4 r9939 (Dec 17 2012)

15
+1 soweit es imagemagick betrifft. Es scheint ein Problem mit der SVG-Engine zu geben. In den meisten Fällen konnte ich damit keine genauen Ergebnisse erzielen. Inkscape, OTOH, funktioniert einwandfrei.
Glutanimate

13
Ich denke, Inkscape ist nach Linux das beeindruckendste Beispiel für OSS. Danke für den Tipp!
Kim3er

8
Funktioniert auch gut unter OSX.
Jonas Granvik

12
Unter OSX, mit Inkscape für X11 installiert, funktionierte es für mich mit:/Applications/Inkscape.app/Contents/Resources/bin/inkscape -z -e test.png -w 1024 -h 1024 test.svg
chmullig

11
@ Rörd Verwenden Sie die -background noneBefehlszeilenoption, um den Hintergrund mit ImageMagick transparent zu halten .
John

142

Versuchen Sie es mit svgexport :

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

svgexport ist ein einfaches Cross-Plattform - Kommandozeilen - Tool , dass ich für den Export von SVG - Dateien in jpg und png gemacht, siehe hier für mehr Optionen. Um svgexport zu installieren , installieren Sie npm und führen Sie dann Folgendes aus:

npm install svgexport -g

Bearbeiten: Wenn Sie ein Problem mit der Bibliothek finden, senden Sie es bitte auf GitHub, danke!


4
svgexport hat bei mir super funktioniert. Die Ausgabe entspricht dem Browser-Rendering viel besser als ImageMagick.
t9mike

5
Die Qualität von svgexport ist wirklich so hoch. Jetzt ist es mein Lieblingswerkzeug geworden, danke Shakiba! :)
Alessio Periloso

1
Das hat auch bei mir gut funktioniert. Echtzeitersparnis im Vergleich zur manuellen Ausführung in einem GUI-Tool. Es ist ziemlich schwierig, eine GUI-App auf einem Mac im günstigeren Bereich zu finden, die SVG gut beherrscht
Erik Engheim

4
Funktioniert hervorragend, erzeugt aber ein riesiges Bild. Mit optipng konnte ich mein Textlogo von 3 Megabyte auf ~ 20 KB komprimieren.
Miek

2
evgexport erstellt je nach Größe RIESIGE PNG-Dateien. Empfehlen Sie svg2png, das auch PhantomJS für den Export verwendet, aber viel kleinere Bilder erstellt.
Aaron_H

112

Das ist nicht perfekt, aber es macht den Job.

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

Grundsätzlich erhöht es die DPI hoch genug (verwenden Sie einfach eine fundierte / sichere Vermutung), dass die Größenänderung mit angemessener Qualität durchgeführt wird. Ich habe versucht, eine richtige Lösung dafür zu finden, aber nach einer Weile entschied ich, dass dies gut genug für meinen aktuellen Bedarf war.

Hinweis: Verwenden Sie 200x200! die gegebene Auflösung zu erzwingen


4
Deckkraft und Schatten gingen in meinem Fall verloren.
Jiyinyiyong

2
Ich habe kein komplexes SVG, also hat das bei mir funktioniert. -resize 200%hat nicht funktioniert und ich musste die Größe in Pixel angeben.
jozxyqk

18
@jiyinyiyong Verwenden Sie die -background noneBefehlszeilenoption, um den Hintergrund mit ImageMagick transparent zu halten . Um das Bildverhältnis beizubehalten, können Sie auch nur eine Dimension angeben, z. B. -resize 200für Breite oder -resize x200Höhe. Siehe: imagemagick.org/script/command-line-processing.php#geometry für erschöpfende ImageMagick Geometrie - Optionen.
John

funktioniert auch bei mir nicht. Das Ergebnis ist alles verschwommen.
mbonnin

(Dies gilt für Linux, möglicherweise für Windows.) Wenn Sie -verbose für IM aktivieren, wird verwendet, dass IM selbst inkscape verwendet, um eine Zwischen-EPS-Datei zu erstellen. Daher würde ich vorschlagen, Inkscape direkt zu verwenden, wie von @ 808sound
Northern Bradley

55

Wenn Sie unter MacOS X arbeiten und Probleme mit der Konvertierung von Imagemagick haben, können Sie versuchen, es mit RSVG lib neu zu installieren. Verwenden von HomeBrew:

brew remove imagemagick
brew install imagemagick --with-librsvg

Stellen Sie sicher, dass es richtig delegiert:

$ 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

Es sollte angezeigt werden rsvg.


Hat bei mir nicht funktioniert. Insbesondere habe ich ausgeführt convert ic_comment_48px.svg -size 30x30 ic_comment_30px.pngund das Ausgabebild ist 48 x 48. Stellen Sie sicher, dass imagemagick an rsvg delegiert, wie Sie erklärt haben.
Shane Creighton-Young

1
Funktionierte perfekt für mich - die Standardeinstellung convertkonvertierte svg in png, aber die Ergebnisse waren hoffnungslos; Nach der Neuinstallation sind sie perfekt. Außerdem ist die Konvertierung erheblich schneller.
ssc

1
Das hat mir unter Mac OSX geholfen. Ich finde die neue Konvertierung nicht schneller, aber viel genauer. Ich empfehle allen Mac OSX-Benutzern, dies einmal auszuprobieren.
HelloWorld

1
Dies sollte die akzeptierte Antwort sein, na ja. Vielen Dank, arbeitete wie ein Zauber, und ich hätte nie gewusst, diese Schritte anders zu machen
Sdailey

8
Auf Mojave bekomme ichinvalid option: --with-librsvg
Zaitsman

39

Inkscape scheint nicht zu funktionieren, wenn SVG-Einheiten nicht vorhanden sind px(z. B. cm). Ich habe ein leeres Bild. Vielleicht konnte es durch Drehen der dpi behoben werden, aber es war zu mühsam.

Svgexport ist ein node.js-Programm und daher im Allgemeinen nicht nützlich.

Imagemagicks Konvertierung funktioniert einwandfrei mit:

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

Wenn Sie verwenden -resize, ist das Bild unscharf und die Datei ist viel größer.

BESTE

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

Es ist am schnellsten, hat die geringsten Abhängigkeiten und die Ausgabe ist etwa 30% kleiner als die Konvertierung. Installieren Sie librsvg2-bin, um es zu erhalten. Es scheint keine Manpage zu geben, aber Sie können Folgendes eingeben:

~$ rsvg --help

um Hilfe zu bekommen. Einfach ist gut.


2
Dies ist leicht die beste Antwort (ich weiß nicht, warum zwanzig verschiedene Antworten die gleiche Imagemagick-Antwort geben); Es bewahrt Farben und Schatten und verstümmelt nichts. Um jedoch das Größenänderungsverhalten des Imagemagicks anzupassen (insbesondere bedeutet WxH, dass das Bild in eine Box dieser Größe passt und das Seitenverhältnis erhalten -ableibt ), sollte der Parameter mit rsvg verwendet werden.
Mahmoud Al-Qudsi

1
Dies hat meine Bilder verstümmelt, alle möglichen seltsamen Artefakte. inkscape hat einen besseren Job gemacht.
elegante Würfel

1
Seien Sie gewarnt, brew install rsvgunter OSX werden eine Million Dinge installiert - GDK, OpenSSL, Python usw.
Timmmm

4
Zu Ihrer Information, der aktuelle Installationsbefehl ist brew install librsvgund der Konvertierungsbefehl ist rsvg-convert.
Waldyrious

Ich fand librsvg (oder rsvg-convertim Fall von Arch), um die besten und konsistentesten Ergebnisse bei der Konvertierung komplizierter svgs in png zu erzielen. Follow-up mit optipng, um die Größe der Ausgabedatei zu reduzieren.
Maktel

18

Nachdem ich die Schritte in Jose Albans Antwort befolgt hatte, konnte ich ImageMagick mit dem folgenden Befehl zum Funktionieren bringen:

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

Die Nummer 1536 stammt aus einer Schätzung der Dichte des Baseballstadions. Weitere Informationen finden Sie in dieser Antwort .


15

Um das Bild neu zu skalieren, sollte die Option -densityverwendet werden. Soweit ich weiß, beträgt die Standarddichte 72 und bildet die Größe 1: 1 ab. Wenn das Ausgabe-PNG doppelt so groß sein soll wie das ursprüngliche SVG, setzen Sie die Dichte auf 72 * 2 = 144:

convert -density 144 source.svg target.png

Beachten Sie, dass die Konvertierungsoptionen vor der Eingabedatei stehen müssen. Dh , convert source.svg -density 144 target.pngwird das Bild nicht neu skalieren.
Skippy le Grand Gourou

Eigentlich scheint die Standarddichte 90 zu sein. So wäre esconvert -density 180 source.svg target.png
Adius

7

Warum versuchst du nicht die Inkscape-Befehlszeile? Dies ist meine Bat-Datei, um alle SVG in diesem Verzeichnis in PNG zu konvertieren:

FÜR %% x IN (* .svg) DO C: \ Tinte \ App \ Inkscape \ inkscape.exe %% x -z --export-dpi = 500 --export-area-zeichnung --export-png = "% % ~ nx.png "


4

Ich bin zu diesem Beitrag gekommen - aber ich wollte die Konvertierung nur stapelweise und schnell ohne Verwendung von Parametern durchführen (aufgrund mehrerer Dateien mit unterschiedlichen Größen).

rsvg drawing.svg drawing.png

Für mich waren die Anforderungen wahrscheinlich etwas einfacher als für den ursprünglichen Autor. (Wollte SVGs in MS PowerPoint verwenden, erlaubt es aber nicht)


1
Als Referenz wird dies unter macOS mit installiert brew install librsvgund der Konvertierungsbefehl lautet rsvg-convert.
Waldyrious

in Ubutni ist es auch rsvg-convert, das Paket ist librsvg2-bin und die Ausgabe benötigt -o draw.png
teknopaul

4

In ImageMagick erhält man ein besseres SVG-Rendering, wenn man Inkscape oder RSVG mit ImageMagick verwendet als sein eigenes internes MSVG / XML-Rendering. RSVG ist ein Delegat, der mit ImageMagick installiert werden muss. Wenn Inkscape auf dem System installiert ist, wird es von ImageMagick automatisch verwendet. Ich verwende Inkscape in ImageMagick unten.

Es gibt keinen "magischen" Parameter, der das tut, was Sie wollen.

Man kann jedoch sehr einfach die genaue Dichte berechnen, die zum Rendern der Ausgabe erforderlich ist.

Hier ist eine kleine 50x50-Schaltfläche, wenn sie mit der Standarddichte von 96 gerendert wird:

convert button.svg button1.png


Geben Sie hier die Bildbeschreibung ein

Angenommen, die Ausgabe soll 500 sein. Die Eingabe ist 50 bei einer Standarddichte von 96 (ältere Versionen von Inkscape verwenden möglicherweise 92). So können Sie die benötigte Dichte proportional zu den Verhältnissen der Dimensionen und Dichten berechnen.

512/50 = X/96
X = 96*512/50 = 983


convert -density 983 button.svg button2.png


Geben Sie hier die Bildbeschreibung ein

In ImageMagick 7 können Sie die Berechnung wie folgt inline durchführen:

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

Die Gleichung in magick DSL war sehr hilfreich!
Cyrf

2

Eine Sache, die mich nur gebissen hat, war das Setzen des -densityNACH dem Namen der Eingabedatei. Das hat nicht funktioniert. Wenn Sie es auf die erste Option in convert verschieben (vor allem anderen), funktioniert es (für mich, YMMV usw.).


2

Für die einfache Konvertierung von SVG in PNG stellte ich fest, dass cairosvg ( https://cairosvg.org/ ) eine bessere Leistung als ImageMagick aufweist. Schritte zum Installieren und Ausführen aller SVG-Dateien in Ihrem Verzeichnis.

pip3 install cairosvg

Öffnen Sie eine Python-Shell in dem Verzeichnis, das Ihre .svg-Dateien enthält, und führen Sie Folgendes aus:

import os

for file in os.listdir('.'):
    name = file.split('.svg')[0]
    cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

Dadurch wird auch sichergestellt, dass Sie Ihre ursprünglichen SVG-Dateien nicht überschreiben, sondern denselben Namen beibehalten. Sie können dann alle Ihre PNG-Dateien in ein anderes Verzeichnis verschieben mit:

$ mv *.png [new directory]

Für mich unter Windows 10 abgestürzt: Importieren Sie Cairocffi als Cairo-Datei "c: \ Programme (x86) \ python35-32 \ lib \ site-packages \ cairocffi_ init_ .py", Zeile 39, in <module> cairo = dlopen (ffi) , 'cairo', 'cairo-2', 'cairo-gobject-2', 'cairo.so.2') Datei "c: \ Programme (x86) \ python35-32 \ lib \ site-packages \ cairocffi_ init_ .py ", Zeile 36, in dlopen erhöhen OSError (" dlopen () konnte eine Bibliothek nicht laden:% s "% '/' .join (names)) OSError: dlopen () konnte eine Bibliothek nicht laden: cairo / cairo- 2 / cairo-gobject-2 / cairo.so.2
Pete Lomax

Schön, cairosvgauf Ubuntu-19.04 hat das den Job für mich gemacht.
fhgd

2

Ohne librsvg erhalten Sie möglicherweise ein schwarzes PNG / JPEG-Bild. Wir müssen installieren librsvgzuconvert SVG - Datei mit ImageMagick.

Ubuntu

 sudo apt-get install imagemagick librsvg
 convert -density 1200 test.svg test.png

Mac OS

 brew install imagemagick librsvg
 convert -density 1200 test.svg test.png

Ich habe diese Bibliothek nicht installiert und bekomme auch keine schwarzen Bilder.
Aaron Franke

1

Ich habe dieses Problem durch Ändern der widthund height-Attribute von gelöst<svg> Tags so geändert habe, dass es meiner beabsichtigten Ausgabegröße entspricht, und es dann mit ImageMagick konvertiert habe. Klappt wunderbar.

Hier ist mein Python-Code, eine Funktion, die den Inhalt der JPG-Datei zurückgibt:

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

2
Warum sollten Sie ein computergeneriertes Bild als JPEG zurückgeben :(?
Willi Mentzel

1

Die Top-Antwort von @ 808sound hat bei mir nicht funktioniert. Ich wollte die Größe ändern Kenney.nl UI Pack

und bekam Kenney UI Pack hat es vermasselt

Anstatt also öffnete ich Inkscape, dann ging an File, Export as PNG fileund ein GUI - Box aufgetaucht , dass mir erlaubt , die genauen Maße einstellen ich brauchte.

Version am Ubuntu 16.04 Linux: Inkscape 0.91 (September 2016)

(Dieses Bild stammt übrigens aus den Asset Packs von Kenney.nl )


1

Unter MacOS mit Brew funktioniert die Verwendung von librsvg direkt gut

brew install librsvg
rsvg-convert test.svg -o test.png

Viele Optionen sind über verfügbar rsvg-convert --help


0

Unter Linux mit Inkscape 1.0 muss zum Konvertieren von svg nach png verwendet werden

inkscape -w 1024 -h 1024 input.svg --export-file output.png

nicht

inkscape -w 1024 -h 1024 input.svg --export-filename output.png
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.