614 Stimmen

Wie konvertiert man ein SVG in ein PNG mit ImageMagick?

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

convert test.svg test.png

Ich muss die Pixelgröße des ausgegebenen PNGs angeben. -size scheint ignoriert zu werden, -scale Parameter skaliert das PNG nach Es wurde in PNG konvertiert. Das beste Ergebnis habe ich bisher mit der Methode -density Parameter:

convert -density 1200 test.svg test.png

Aber ich bin nicht zufrieden, denn ich möchte die Ausgabegröße in Pixeln angeben, ohne den Dichtewert zu berechnen. Ich möchte also so etwas wie dies tun:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

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

25voto

Ian Punkte 10246

Nachdem Sie die Schritte in Antwort von Jose Alban Ich konnte ImageMagick mit folgendem Befehl zum Laufen bringen:

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

Die Zahl 1536 stammt aus einer groben Schätzung der Dichte, siehe diese Antwort für weitere Informationen.

20voto

mloughran Punkte 10667

Unter macOS mit brew funktioniert die direkte Verwendung von librsvg gut

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

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

20voto

fmw42 Punkte 36588

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, das mit ImageMagick installiert werden muss. Wenn Inkscape auf dem System installiert ist, wird ImageMagick es automatisch verwenden. Ich verwende Inkscape in ImageMagick unten.

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

Aber man kann sehr einfach die genaue Dichte berechnen, die zum Rendern der Ausgabe benötigt wird.

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

convert button.svg button1.png

enter image description here

Angenommen, die Ausgabe soll 500 betragen. 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 im Verhältnis zu den Verhältnissen der Dimensionen und der Dichten berechnen.

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

convert -density 983 button.svg button2.png

enter image description here

In ImageMagick 7 können Sie die Berechnung wie folgt in-line 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

18voto

Stanislav Schmidt Punkte 181

Um das Bild neu zu skalieren, muss die Option -density verwendet werden sollte. Soweit ich weiß, liegt die Standarddichte bei 72 und die Größe bei 1:1. Wenn das ausgegebene 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

11voto

edank Punkte 191

Für die einfache Konvertierung von SVG in PNG habe ich cairosvg ( https://cairosvg.org/ ) eine bessere Leistung als ImageMagick. Schritte zur Installation und Ausführung für alle 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 sie aus:

import os
import cairosvg

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 mit verschieben:

$ mv *.png [new directory]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X