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?

52
demandé sur dreftymac 2012-03-02 13:03:25

6 réponses

Inkscape fera ceci:

inkscape \
    --export-png=out.png --export-dpi=200 \
    --export-background-opacity=0 --without-gui in.svg
49
répondu halfer 2012-08-07 01:52:02

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
73
répondu Micah 2013-09-02 19:10:36

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.

16
répondu sleeper 2012-05-30 10:37:06

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
9
répondu chiliNUT 2017-05-23 12:09:58

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.

0
répondu Yurii Rabeshko 2018-09-22 07:51:47

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
0
répondu C Würtz 2018-10-05 11:56:39