convertir code archivo svg imagemagick png image-resizing

code - svg to png photoshop



Convierta y cambie el tamaƱo de SVG a PNG (5)

El SVG se define como un vector, no como un mapa de bits, que es lo que a IM le gusta tratar. Cuando IM lee un vector, no conoce el tamaño, por lo tanto, cuando hagas esto:

convert compass.svg -resize 1000x1000 compassB.jpg

crea un lienzo de mapa de bits de tamaño predeterminado, "dibuja" el vector en él, luego lo cambia de tamaño y lo guarda como JPEG . El resultado, si el tamaño previsto es más grande que el lienzo que "adiviné" IM es de mala calidad, no puede crear información que ya no tiene como resultado de rasterizar la imagen en un lienzo demasiado pequeño.

La solución es decirle a IM por adelantado que el vector debe dibujarse en un lienzo grande, antes de que rasterice:

convert -size 1000x1000 compass.svg compassA.jpg

Estoy tratando de convertir SVG a PNG (o cualquier formato de trama) y cambiar el tamaño al mismo tiempo.

Pensé que usaría ImageMagick para esta tarea, pero parece que se está convirtiendo en ráster antes de cambiar el tamaño.

Esto da como resultado una imagen de mala calidad.

  • ¿Hay alguna manera de hacer que ImageMagick cambie el tamaño del SVG antes de convertirlo en ráster?

  • ¿O hay alguna otra herramienta que pueda usar para convertir programáticamente un SVG a un ráster después de cambiar el tamaño?

  • Alternativamente, ¿hay alguna otra herramienta que pueda usar para esto?

Actualmente estoy usando ImageMagick a través de una línea de comandos:

convert file.svg -resize 100x100 file.png

La imagen de origen "tamaño" es desconocida y el tamaño de destino no se conoce hasta el tiempo de ejecución.


Entonces resulta que Inkscape tiene una interfaz de línea de comando.

Lamentablemente, los argumentos -w y -h para inkscape no conservan la relación de aspecto. Sin embargo, proporciona una forma de consultar el ancho y la altura actuales, pero solo de a uno por vez.

Entonces la solución es ejecutar Inkscape no menos de 3 veces.

inkscape -f svgfile.svg -W <read stdin into some variable> inkscape -f svgfile.svg -H <read stdin into some variable> <calculate aspect ratio and apply logic to retain aspect for new size> inkscape -f svgfile.svg -w <newwidth> -h <newheight> -e file.png

En mi caso, tuve que ejecutar el archivo generado a través de ImageMagick para realizar operaciones adicionales.

Hacer todo esto desde C # es engorroso, por decir lo menos, por lo que esta pregunta permanece abierta para una mejor solución.


Es extraño que ImageMagick esté renderizando en un tamaño y luego volviendo a escalar el mapa de bits. A menos que, es decir, el SVG tenga un tamaño específico definido en él. Compruebe los atributos de width y height de los archivos SVG que está utilizando. Intente cambiar el ancho y alto al 100% y vea si eso hace la diferencia.

<svg width="100%" height="100%" ...etc...>

(Suponiendo que tiene control sobre los archivos SVG que está usando).


Esta es la forma en que lo hago y parece funcionar.

convert -background none -density 1000 -resize 1000x compass.svg compass.png

Esto es lo que hace cada parte.

  • Use -background none para asegurarse de que las partes transparentes del SVG se mantengan transparentes y no se llenen de blanco.
  • Como ImageMagick solo funciona con imágenes ráster, necesita usar -density 1000 y especificar el ancho al que desea cambiar el tamaño del SVG. De esta forma, cuando llame realmente al comando de cambio de tamaño, la representación ráster del SVG cargado ya tendrá un ancho de 1000; de lo contrario, terminará cambiando el tamaño de un ráster hacia arriba o hacia abajo desde cualquier tamaño original de la imagen SVG.
  • Ahora use -resize 1000x para darle a su SVG un nuevo ancho, la altura se calculará automáticamente para mantener la relación de aspecto.

Una de las trampas de esto, es que realmente no sé cómo se puede cambiar el tamaño en función de la altura y dejar que se analice el ancho ya que la -density se aplica al ancho, no a la altura. Por lo tanto, tendrías que saber la relación real de tu SVG de antemano y trabajar con el ancho correspondiente.


He hecho svgexport para esto:

svgexport file.svg file.png 100:100