it-swarm.com.de

Konvertieren Sie mithilfe von ImageMagick SVG in transparentes PNG mit Antialiasing

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?

55
Andreas Gohr

Inkscape wird dies tun:

inkscape \
    --export-png=out.png --export-dpi=200 \
    --export-background-opacity=0 --without-gui in.svg
51
halfer

Als Randbemerkung fand ich es etwas schwierig, Transparenz zu bekommen. Anstelle von transparent musste ich none verwenden.

convert -background none in.svg out.png
78
Micah

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.

16
sleeper

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
9
chiliNUT

Hinzufügen der Option -transparent whitelö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.

1
Yurii Rabeshko

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
0
C Würtz