Convertir SVG en PNG transparent avec antialiasing, en utilisant ImageMagick
je veux 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 n'arrive pas à obtenir D'ImageMagick de faire l'anti-aliasing, les bords ont toujours l'air terrible. 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?
6 réponses
Inkscape fera ceci:
inkscape \
--export-png=out.png --export-dpi=200 \
--export-background-opacity=0 --without-gui in.svg
comme note d'accompagnement, j'ai trouvé qu'obtenir de la transparence était un peu délicat. Au lieu d'utiliser transparent , j'ai dû utiliser aucun .
convert -background none in.svg out.png
really, reading imagemagick documentation:
- antialias
Activer / Désactiver le rendu des pixels anti-aliasing lors du dessin des polices et des lignes. Par défaut, les objets (par exemple Texte, lignes, polygones, etc.) sont antialiasés lorsqu'ils sont dessinés. Utiliser + antialias pour désactiver l'ajout de pixels de bord antialiasing. Cela réduira ensuite le
nombre de couleurs ajoutées à une image pour juste les couleurs directement tiré. Qui est, sans aucun mixte >les couleurs sont ajoutées lors du dessin de tels objets.
le +antialias va en effet désactiver antialiasing.
la façon dont j'ai appris à faire ceci était de la méthodologie trouvée ici: comment convertir A.fichier eps de haute qualité 1024x1024 .jpg?
c'est la même idée que la solution de @halfer avec inkscape
--pour brancher le DPI en premier--mais vous pouvez accomplir la même chose avec juste imagemagick
en utilisant l'option -density
.
convert -density 200 in.svg -resize 25x25 -transparent white out.png
L'ajout de l'option -transparent white
résout le problème particulièrement dans mon cas parce que le fond n'est pas complètement enlevé (malheureusement ombre légère est présente). Donc J'utilise IMHO plus claire solution qui supprime complètement le fond avec ImageMagic:
convert -channel rgba -background "rgba(0,0,0,0)" in.svg out.png
il définit une couleur noire entièrement transparente comme l'arrière-plan à travers le canal RGBA.
j'ajoute un fond rect. Les CSS embed cachent l'arrière-plan. Puis j'attrape sa couleur pour définir L'attribut transparent D'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="\([^"]*\)".*//'`
convert $f -transparent "$BGCOLOR" $g
done