Comment convertir un SVG en PNG avec Image Magick?

J'ai un fichier SVG qui a une taille définie de 16x16. Lorsque j'utilise le programme convert D'Image Magick pour le convertir en PNG, j'obtiens un PNG de 16x16 pixels qui est trop petit:

convert test.svg test.png

Je dois spécifier la taille de pixel de la sortie PNG. -size paramètre semble être ignoré, -scale paramètre met à l'échelle le PNG après il a été converti en PNG. Le meilleur résultat jusqu'à présent que j'ai obtenu en utilisant le paramètre -density:

convert -density 1200 test.svg test.png

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

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

Quel est donc le paramètre magique que je dois utiliser ici?

262
demandé sur javac 2012-03-24 20:24:39

13 réponses

Je n'ai pas pu obtenir de bons résultats avec ImageMagick dans ce cas, mais Inkscape fait un 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 16x16 à un PNG 200x200 en utilisant cette commande:

entrez la description de l'image ici

entrez la description de l'image ici

Juste pour référence, ma version Inkscape (sur Ubuntu 12.04) est:

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

Et sur Windows 7, c'est:

Inkscape 0.48.4 r9939 (Dec 17 2012)
361
répondu 808sound 2013-01-05 18:09:55

Essayer svgexport:

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

Svgexport est un outil de ligne de commande multi-plateforme simple que j'ai fait pour exporter des fichiers svg au format jpg et png, voir ici pour plus d'options. Pour installer svgexport installer mnp, puis exécutez:

npm install svgexport -g

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

97
répondu Ali Shakiba 2017-03-11 04:25:38

Ce n'est pas parfait, mais il fait le travail.

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

Fondamentalement, il augmente le DPI assez élevé (il suffit d'utiliser une supposition éduquée/sûre) que le redimensionnement est fait avec une qualité adéquate. J'ai essayé de trouver une solution adéquate à ce mais après un certain temps décidé que c'était assez bon pour mon besoin actuel.

Remarque: Utiliser 200x200! pour forcer la résolution donnée

77
répondu Hardev 2015-09-29 10:10:25

Si vous êtes sur MacOS X et que vous rencontrez des problèmes avec le convert D'Imagemagick, vous pouvez essayer de le réinstaller avec RSVG lib. Utilisation De HomeBrew:

brew remove imagemagick
brew install imagemagick --with-librsvg

Vérifiez qu'il délègue correctement:

$ 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.

47
répondu Jose Alban 2014-12-17 11:46:39

Inkscape ne semble pas fonctionner lorsque les unités svg ne sont pas px (par exemple cm). J'ai obtenu une image vide. Peut - être, cela pourrait être corrigé en tordant le dpi, mais c'était trop gênant.

Svgexport est un nœud.programme js et donc pas généralement utile.

Le convert 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 est beaucoup plus grande.

Meilleur

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

Il est le plus rapide, a le moins de dépendances, et la sortie est d'environ 30% plus petit que convertir. 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 est bon.

23
répondu september_converter 2015-09-14 22:03:06

Après avoir suivi les étapes de la réponse de Jose Alban , J'ai pu faire fonctionner ImageMagick en utilisant la commande suivante:

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

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

12
répondu Ian 2017-05-23 12:26:38

Afin de redimensionner l'image, l'option-densité doit être utilisé. Pour autant que je sache, la densité standard est de 72 et mappe la taille 1:1. Si vous voulez que le PNG de sortie soit aussi double que le svg d'origine, définissez la densité sur 72 * 2=144

Convertir-densité 144 source.cible svg.png

8
répondu Stanislav Schmidt 2013-04-14 09:58:38

Pourquoi ne pas essayer la ligne de commande inkscape, c'est mon fichier bat pour convertir tout svg dans ce répertoire en png:

Pour % % x dans (*.svg) faire C:\Ink\App\Inkscape\inkscape.exe % % XZ --export-dpi = 500 --export-area-drawing --export-png= " % % ~nx.png "

6
répondu ampecs 2013-01-05 17:07:39

Une chose qui m'a juste mordu était de définir le -density après le nom du fichier d'entrée. Cela ne fonctionne pas. Le déplacer vers la première option dans convert (avant toute chose) l'a fait fonctionner (pour moi, YMMV, etc.).

2
répondu Nick 2017-10-23 23:19:44

Je suis venu à ce post-mais je voulais juste faire la conversion par lots et rapide sans l'utilisation de paramètres (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 SVG dans MS PowerPoint, mais cela ne le permet pas)

1
répondu Qohelet 2015-05-28 09:33:42

J'ai résolu ce problème en changeant les attributs width et height de la balise <svg> pour correspondre à la taille de sortie prévue, puis en la convertissant en utilisant 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, parseString


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 = parseString(svg)

    width = float(xmldoc.getElementsByTagName("svg")[0].attributes['width'].value.split('px')[0])
    height = float(xmldoc.getElementsByTagName("svg")[0].attributes['height'].value.split('px')[0])

    newHeight = int(newWidth / width * height) 

    xmldoc.getElementsByTagName("svg")[0].attributes['width'].value = '%spx' % newWidth
    xmldoc.getElementsByTagName("svg")[0].attributes['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
1
répondu Yanone 2015-11-24 19:57:50

La réponse supérieure de @808sound n'a pas fonctionné pour moi. Je voulais redimensionner Kenney.nl Pack UI

Et obtenu Kenney UI Pack foiré

Donc, à la place, J'ai ouvert Inkscape, puis je suis allé à File, Export as PNG fileet une boîte graphique est apparue qui 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 de Kenney.nl les packs d'actifs au fait)

0
répondu James L. 2016-09-07 18:45:34

Pour une simple conversion SVG en PNG, j'ai trouvé cairosvg ( https://cairosvg.org/) fonctionne mieux que 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 qui contient votre .fichiers svg et exécuter:

import os

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

Cela vous permettra également de ne pas écraser votre original .fichiers svg, mais gardera le même nom. Vous pouvez ensuite déplacer tous vos .fichiers png dans un autre répertoire avec:

$ mv *.png [new directory]
0
répondu edank 2018-05-11 21:30:46