Ich möchte SVG-Bilder in PNG-Dateien mit transparentem Hintergrund und Anti-Alias-Kanten (unter Verwendung halbtransparenter Pixel) konvertieren. Leider kann ich ImageMagick nicht dazu bringen, das Anti-Aliasing durchzuführen, die Kanten sehen immer furchtbar aus. Folgendes habe ich ausprobiert:
convert +antialias -background transparent in.svg -resize 25x25 out.png
Irgendwelche Ideen oder ein anderes Befehlszeilentool, das ich verwenden könnte?
Inkscape wird dies tun:
inkscape \
--export-png=out.png --export-dpi=200 \
--export-background-opacity=0 --without-gui in.svg
Als Randbemerkung fand ich es etwas schwierig, Transparenz zu bekommen. Anstelle von transparent musste ich none verwenden.
convert -background none in.svg out.png
Eigentlich beim Lesen der Imagemagick-Dokumentation:
-antialien
Aktivieren/Deaktivieren der Wiedergabe von Anti-Aliasing-Pixeln beim Zeichnen von Schriftarten und Linien . Standardmäßig werden Objekte (z. B. Text, Linien, Polygone usw.) beim Zeichnen antialiasiert. Benutzen + Antialias, um das Hinzufügen von Kantenpixeln für das Antialiasing zu deaktivieren. Dies reduziert dann die
Anzahl der Farben, die einem Bild hinzugefügt werden, um nur die Farben zu zeichnen, die direkt gezeichnet werden. Das heißt, nein Beim Zeichnen solcher Objekte werden gemischte Farben hinzugefügt.
das Antialiasing + wird Antialiasing tatsächlich deaktivieren.
Wie ich dies gelernt habe, war die Methode, die hier zu finden ist: Wie konvertiere ich eine .eps-Datei in eine hochwertige 1024x1024 .jpg-Datei?
Es ist dieselbe Idee wie die Lösung von @ halfer mit inkscape
--, um die DPI zuerst zu erhöhen - aber Sie können dasselbe auch mit imagemagick
erreichen, indem Sie die -density
-Option verwenden.
convert -density 200 in.svg -resize 25x25 -transparent white out.png
Hinzufügen der Option -transparent white
löst das Problem besonders in meinem Fall, weil der Hintergrund nicht vollständig entfernt wird (leider ist ein heller Schatten vorhanden). Also benutze ich IMHO klarer Lösung, die den Hintergrund vollständig entfernt mit ImageMagic:
convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png
Es legt eine vollständig transparente schwarze Farbe als Hintergrund für den RGBA-Kanal fest.
Ich füge ein Rect als Hintergrund hinzu. Das eingebettete CSS blendet den Hintergrund aus . Dann fange ich die Farbe ein, um das transparente Attribut von ImageMagick festzulegen.
SVG-Datei:
<?xml version="1.0" ?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>
<svg
version="1.1" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="500px" height="500px"
viewBox="0 0 500 500"
enable-background="new 0 0 500 500"
>
<defs>
<style>
#background { display: none; }
</style>
</defs>
<rect id="background" x="0" y="0" width="500" height="500" fill="#e8e437"/>
<!-- beginning of the sketch -->
<g fill="#000" text-anchor="middle"font-size="112">
<text y="350" x="192">OK</text>
</g>
<!-- end of the sketch -->
</svg>
bash-Skript
#!/bin/bash
BASE_DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )
SVG_DIR="$BASE_DIR/import"
PNG_DIR="$BASE_DIR/export"
for f in `ls $SVG_DIR/*.svg`
do
g="$PNG_DIR/$(basename "$f" .svg).png"
BGCOLOR=`grep 'id="background"' $f \
| sed 's/.* fill="\([^"]*\)".*/\1/'`
convert $f -transparent "$BGCOLOR" $g
done