svg imagemagick png

¿Cómo convertir un SVG a PNG con Image Magick?



imagemagick (13)

¿Por qué no le das una oportunidad a la línea de comandos de inkscape? Este es mi archivo bat para convertir todos los svg en este directorio a png:

FOR %% x IN (* .svg) DO C: / Ink / App / Inkscape / inkscape.exe %% x -z --export-dpi = 500 --export-area-drawing --export-png = "% % ~ nx.png "

Tengo un archivo SVG que tiene un tamaño definido de 16x16. Cuando uso el programa de conversión de Image Magick para convertirlo en PNG, obtengo un PNG de 16x16 píxeles que es demasiado pequeño:

convert test.svg test.png

Necesito especificar el tamaño de píxel de la salida PNG. -size parámetro de -size parece ser ignorado, el parámetro de escala escala el PNG después de que se haya convertido a PNG. El mejor resultado hasta ahora que obtuve al usar el parámetro -density :

convert -density 1200 test.svg test.png

Pero no estoy satisfecho porque quiero especificar el tamaño de salida en píxeles sin hacer cálculos matemáticos para calcular el valor de densidad. Así que quiero hacer algo como esto:

convert -setTheOutputSizeOfThePng 1024x1024 test.svg test.png

Entonces, ¿cuál es el parámetro mágico que tengo que usar aquí?


Después de seguir los pasos de share , pude hacer que ImageMagick funcionara bien usando el siguiente comando:

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

El número 1536 proviene de una estimación aproximada de densidad, consulte esta respuesta para obtener más información.


Esto no es perfecto pero hace el trabajo.

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

Básicamente, aumenta el DPI lo suficientemente alto (solo use una suposición educada / segura) que el cambio de tamaño se realiza con la calidad adecuada. Estaba tratando de encontrar una solución adecuada para esto pero después de un tiempo decidí que esto era lo suficientemente bueno para mi necesidad actual.

Nota: ¡ Usa 200x200! forzar la resolución dada


Inkscape no parece funcionar cuando las unidades svg no son px (por ejemplo, cm). Tengo una imagen en blanco. Tal vez, podría ser arreglado por twiddling el dpi, pero era demasiado molesto.

Svgexport es un programa node.js y por lo tanto no es generalmente útil.

La conversión de Imagemagick funciona bien con:

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

Si utiliza -resize , la imagen es borrosa y el archivo es mucho más grande.

MEJOR

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

Es más rápido, tiene la menor cantidad de dependencias y la salida es aproximadamente un 30% más pequeña que la conversión. Instale librsvg2-bin para conseguirlo. No parece haber una página de manual, pero puede escribir:

~$ rsvg --help

para obtener alguna ayuda Lo simple es bueno.


Intente svgexport :

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

svgexport es una sencilla herramienta de línea de comandos multiplataforma que he creado para exportar archivos svg a jpg y png, consulte svgexport para obtener más opciones. Para instalar svgexport, instale npm , luego ejecute:

npm install svgexport -g

Edit: Si encuentra un problema con la biblioteca, envíelo a GitHub, ¡gracias!


La mejor respuesta de @ 808sound no funcionó para mí. Queria redimensionar

y consiguió

Así que en lugar de eso, abrí Inkscape, luego fui a File , Export as PNG file y apareció un cuadro de GUI que me permitió establecer las dimensiones exactas que necesitaba.

Versión en Ubuntu 16.04 Linux : Inkscape 0.91 (September 2016)

(Esta imagen es de los paquetes de activos de Kenney.nl, por cierto)


Llegué a este post, pero solo quería hacer la conversión por lotes y rápido sin el uso de ningún parámetro (debido a varios archivos con diferentes tamaños).

rsvg drawing.svg drawing.png

Para mí, los requisitos fueron probablemente un poco más fáciles que para el autor original. (Quería usar SVG en MS PowerPoint, pero no lo permite)


No he podido obtener buenos resultados de ImageMagick en este caso, pero Inkscape hace un buen trabajo en Linux y Windows:

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

Aquí está el resultado de escalar un SVG 16x16 a un PNG 200x200 usando este comando:

Solo como referencia, mi versión de Inkscape (en Ubuntu 12.04) es:

Inkscape 0.48.3.1 r9886 (Mar 29 2012)

y en Windows 7, es:

Inkscape 0.48.4 r9939 (Dec 17 2012)


Para una simple conversión de SVG a PNG, encontré que cairosvg ( https://cairosvg.org/ ) tiene un mejor desempeño que ImageMagick. Pasos para instalar y ejecutar en todos los archivos SVG en su directorio.

pip3 install cairosvg

Abra un shell de Python en el directorio que contiene sus archivos .svg y ejecute:

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

Esto también asegurará que no sobrescriba sus archivos .svg originales, pero mantendrá el mismo nombre. Luego puede mover todos sus archivos .png a otro directorio con:

$ mv *.png [new directory]


Para volver a escalar la imagen, se debe utilizar la opción -density . Por lo que sé, la densidad estándar es 72 y asigna el tamaño 1: 1. Si desea que la salida png sea dos veces más grande que el svg original, configure la densidad en 72 * 2 = 144:

convert -density 144 source.svg target.png


Resolví este problema cambiando los atributos de width y height de la etiqueta <svg> para que coincidan con el tamaño de salida deseado y luego convirtiéndolo con ImageMagick. Funciona de maravilla.

Aquí está mi código de Python, una función que devolverá el contenido del archivo 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


Si está en MacOS X y tiene problemas con el convertidor de Imagemagick, puede intentar reinstalarlo con RSVG lib. Utilizando HomeBrew:

brew remove imagemagick brew install imagemagick --with-librsvg

Verifique que esté delegando correctamente:

$ 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

Debe mostrar rsvg .


Una cosa que me mordió fue establecer la -density DESPUÉS del nombre del archivo de entrada. Eso no funcionó. Moverlo a la primera opción de conversión (antes que nada) lo hizo funcionar (para mí, YMMV, etc.).