Comment convertir un SVG en PNG avec Image Magick?

J’ai un fichier SVG qui a une taille définie de 16×16. Lorsque j’utilise le programme de conversion d’Image Magick pour le convertir en PNG, je reçois un PNG de 16×16 pixels, ce qui est beaucoup trop petit:

convert test.svg test.png 

J’ai besoin de spécifier la taille en pixels du PNG en sortie. -size paramètre -size semble être ignoré, le paramètre -scale échelle le PNG après sa conversion en PNG. Le meilleur résultat obtenu à ce -density paramètre -density :

 convert -density 1200 test.svg test.png 

Mais je ne suis pas satisfait parce que je veux spécifier la taille de sortie en pixels sans faire de calcul pour calculer la valeur de densité. Donc, je veux faire quelque chose comme ça:

 convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png 

Alors, quel est le paramètre magique que je dois utiliser ici?

Je n’ai pas pu obtenir de bons résultats avec ImageMagick dans cette instance, mais Inkscape fait du bon travail sous Linux et Windows:

 inkscape -z -e test.png -w 1024 -h 1024 test.svg 

Voici le résultat de la mise à l’échelle d’un SVG 16×16 en un PNG 200×200 en utilisant cette commande:

entrer la description de l'image ici

entrer la description de l'image ici

À titre de référence, ma version d’Inkscape (sur Ubuntu 12.04) est la suivante:

 Inkscape 0.48.3.1 r9886 (Mar 29 2012) 

et sur Windows 7, c’est:

 Inkscape 0.48.4 r9939 (Dec 17 2012) 

Essayez svgexport :

 svgexport input.svg output.png 64x svgexport input.svg output.png 1024:1024 

svgexport est un simple outil de ligne de commande multi-plateforme que j’ai créé pour exporter des fichiers svg en jpg et png, voir ici pour plus d’options. Pour installer svgexport install npm , exécutez:

 npm install svgexport -g 

Edit: Si vous trouvez un problème avec la bibliothèque, merci de le soumettre sur GitHub, merci!

Ce n’est pas parfait mais ça fait le boulot.

 convert -density 1200 -resize 200x200 source.svg target.png 

Fondamentalement, cela augmente le DPI suffisamment élevé (utilisez simplement une estimation éclairée / sûre) que le redimensionnement est effectué avec une qualité adéquate. J’essayais de trouver une solution appropriée à cela, mais après un certain temps, j’ai décidé que c’était suffisant pour mes besoins actuels.

Remarque: utilisez 200×200! pour forcer la résolution donnée

Si vous utilisez MacOS X et que vous rencontrez des problèmes avec la conversion d’Imagemagick, vous pouvez essayer de le réinstaller avec la bibliothèque RSVG. Utiliser HomeBrew:

 brew remove imagemagick brew install imagemagick --with-librsvg 

Vérifiez que la délégation est correcte:

 $ convert -version Version: ImageMagick 6.8.9-8 Q16 x86_64 2014-12-17 http://www.imagemagick.org Copyright: Copyright (C) 1999-2014 ImageMagick Studio LLC Features: DPC Modules Delegates: bzlib cairo fontconfig freetype jng jpeg lcms ltdl lzma png rsvg tiff xml zlib 

Il devrait afficher rsvg .

Inkscape ne semble pas fonctionner lorsque les unités svg ne sont pas px (par exemple cm). J’ai une image vierge. Peut-être que cela pourrait être résolu en changeant la résolution en dpi, mais c’était trop gênant.

Svgexport est un programme node.js et n’est donc généralement pas utile.

Le convertisseur d’Imagemagick fonctionne bien avec:

  ~$ convert -background none -size 1024x1024 infile.svg outfile.png 

Si vous utilisez -resize , l’image est floue et le fichier beaucoup plus volumineux.

MEILLEUR

 ~$ rsvg -w 1024 -h 1024 infile.svg outfile.png 

Il est le plus rapide, possède le moins de dépendances et la sortie est environ 30% plus petite que la conversion. Installez librsvg2-bin pour l’obtenir. Il ne semble pas y avoir de page de manuel mais vous pouvez taper:

 ~$ rsvg --help 

pour obtenir de l’aide. Simple c’est bien.

Après avoir suivi les étapes de la réponse de Jose Alban , j’ai réussi à faire fonctionner ImageMagick à l’aide de la commande suivante:

 convert -density 1536 -background none -resize 100x100 input.svg output-100.png 

Le nombre 1536 provient d’une estimation approximative de la densité, voir cette réponse pour plus d’informations.

Pour redimensionner l’image, l’option -density doit être utilisée. Pour autant que je sache, la densité standard est de 72 et correspond à la taille 1: 1. Si vous voulez que le png de sortie soit aussi gros que la densité du set svg d’origine à 72 * 2 = 144

convertir -densité 144 source.svg target.png

pourquoi ne pas essayer inkscape en ligne de commande, ceci est mon fichier bat pour convertir tous les svg dans ce répertoire en png:

FOR %% x IN (* .svg) DO C: \ Encre \ App \ Inkscape \ inkscape.exe %% x -z –export-dpi = 500 –export-area-drawing –export-png = “% % ~ nx.png ”

Une chose qui m’a juste mordu était la définition de la -density le nom du fichier d’entrée. Cela n’a pas marché. En le déplaçant vers la première option dans convert (avant tout), cela a fonctionné (pour moi, YMMV, etc.).

Je suis venu à ce post – mais je voulais juste faire la conversion par lot et rapide sans l’utilisation de parameters (en raison de plusieurs fichiers de tailles différentes).

 rsvg drawing.svg drawing.png 

Pour moi, les exigences étaient probablement un peu plus faciles que pour l’auteur original. (Je voulais utiliser des fichiers SVG dans MS PowerPoint, mais cela ne permet pas)

J’ai résolu ce problème en modifiant les atsortingbuts width et height de la pour qu’ils correspondent à la taille de sortie souhaitée, puis en les convertissant avec ImageMagick. Fonctionne comme un charme.

Voici mon code Python, une fonction qui retournera le contenu du fichier JPG:

 import gzip, re, os from ynlib.files import ReadFromFile, WriteToFile from ynlib.system import Execute from xml.dom.minidom import parse, parseSsortingng def SVGToJPGInMemory(svgPath, newWidth, backgroundColor): tempPath = os.path.join(self.rootFolder, 'data') fileNameRoot = 'temp_' + str(image.getID()) if svgPath.lower().endswith('svgz'): svg = gzip.open(svgPath, 'rb').read() else: svg = ReadFromFile(svgPath) xmldoc = parseSsortingng(svg) width = float(xmldoc.getElementsByTagName("svg")[0].atsortingbutes['width'].value.split('px')[0]) height = float(xmldoc.getElementsByTagName("svg")[0].atsortingbutes['height'].value.split('px')[0]) newHeight = int(newWidth / width * height) xmldoc.getElementsByTagName("svg")[0].atsortingbutes['width'].value = '%spx' % newWidth xmldoc.getElementsByTagName("svg")[0].atsortingbutes['height'].value = '%spx' % newHeight WriteToFile(os.path.join(tempPath, fileNameRoot + '.svg'), xmldoc.toxml()) Execute('convert -background "%s" %s %s' % (backgroundColor, os.path.join(tempPath, fileNameRoot + '.svg'), os.path.join(tempPath, fileNameRoot + '.jpg'))) jpg = open(os.path.join(tempPath, fileNameRoot + '.jpg'), 'rb').read() os.remove(os.path.join(tempPath, fileNameRoot + '.jpg')) os.remove(os.path.join(tempPath, fileNameRoot + '.svg')) return jpg 

La première réponse de @ 808sound n’a pas fonctionné pour moi. Je voulais redimensionner Pack d'interface utilisateur Kenney.nl

et a Pack d'interface utilisateur de Kenney

Donc, à la place, j’ai ouvert Inkscape, puis je suis allé dans File , Export as PNG file et une boîte graphique m’a permis de définir les dimensions exactes dont j’avais besoin.

Version sur Ubuntu 16.04 Linux : Inkscape 0.91 (September 2016)

(Cette image provient des packs d’actifs de Kenney.nl )

Pour une conversion SVG en PNG simple, j’ai trouvé cairosvg ( https://cairosvg.org/ ) plus performant qu’ImageMagick. Étapes d’installation et d’exécution sur tous les fichiers SVG de votre répertoire.

 pip3 install cairosvg 

Ouvrez un shell python dans le répertoire contenant vos fichiers .svg et exécutez:

 import os for file in os.listdir('.'): name = file.split('.svg')[0] cairosvg.svg2png(url=name+'.svg',write_to=name+'.png') 

Cela garantira également que vous n’écrasez pas vos fichiers .svg d’origine, mais gardera le même nom. Vous pouvez ensuite déplacer tous vos fichiers .png vers un autre répertoire avec:

 $ mv *.png [new directory]