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