¿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
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.).