web-dev-qa-db-fra.com

Conversion de fichiers SVG en fichiers PNG transparents avec antialiasing, à l'aide d'ImageMagick

Je souhaite convertir des images SVG en fichiers PNG avec un fond transparent et des bords anti-aliasés (en utilisant des pixels semi-transparents). Malheureusement, je ne parviens pas à obtenir l'anti-aliasing avec ImageMagick, les contours sont toujours terribles. Voici ce que j'ai essayé:

convert +antialias -background transparent  in.svg -resize 25x25 out.png

Des idées ou un autre outil en ligne de commande que je pourrais utiliser?

55
Andreas Gohr

Inkscape fera ceci:

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

En remarque, j'ai trouvé qu'il était un peu délicat d'obtenir de la transparence. Au lieu d'utiliser transparent , je devais utiliser none .

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

En fait, en lisant la documentation d’imagemagick:

-antialias

Activer/désactiver le rendu des pixels anti-aliasing lors du dessin de polices et de lignes . Par défaut, les objets (texte, lignes, polygones, etc.) sont anticrénelés lors de leur dessin. Utilisation + antialias pour désactiver l'ajout de pixels antialiasing Edge. Cela réduira alors le
nombre de couleurs ajoutées à une image uniquement aux couleurs dessinées directement. C'est-à-dire non. des couleurs mélangées sont ajoutées lors du dessin de tels objets.

le + antialias désactivera en effet l'antialiasing.

16
sleeper

La façon dont j’ai appris à faire cela s’appuyait sur la méthodologie présentée ici: Comment convertir un fichier .eps en 1024x1024 .jpg en haute qualité?

C’est la même idée que la solution de @ halfer avec inkscape-- pour graver d’abord le DPI, mais vous pouvez accomplir la même chose avec seulement imagemagick en utilisant l’option -density.

convert -density 200 in.svg -resize 25x25 -transparent white out.png
9
chiliNUT

J'ajoute un rect comme fond. Le CSS incorporé masque l’arrière-plan . Ensuite, j’attrape sa couleur pour définir l’attribut transparent de ImageMagick. 


Fichier SVG:

<?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>

script bash

#!/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