¿Cómo cambiar el tamaño de todas las imágenes .svg dentro de una carpeta a la vez en Linux?

Tengo algunas imágenes que hice en inkscape con .svgextensión. Estas imágenes tienen varios tamaños (256*265, 512*512, etc.) en píxeles.

¿Cómo puedo cambiar el tamaño de todas estas imágenes a la vez en Linux?

La sugerencia de @Joonas de usar ImageMagick entra en conflicto con este consejo: Evite usar ImageMagick para conversiones de 'Imagen vectorial' a 'Imagen vectorial' . Inkscape se rasterizaría (convertiría a mapa de bits): no estoy seguro de si sigue siendo cierto, a partir de 2021.

Respuestas (2)

Encontré la solución a mi problema, la forma de hacerlo es usandorsvg-converter

y después de buscar en 3W encontré este script aquí

todo lo que necesita es hacer que este script sea ejecutable y ejecutarlo seguido de un nuevo tamaño para su .svg(s) archivo(s)

¿Qué pasa si quiero un factor de escala en lugar de hacer que todos los SVG tengan el mismo tamaño?

no lo hagas

Sin conocer su razón para querer hacer esto, mi reacción inicial es no hacerlo .

El tamaño de un archivo SVG es realmente una sugerencia: están diseñados para aumentar y reducir su tamaño (por lo tanto , gráficos vectoriales escalables ). La altura y el ancho de un archivo SVG para la mayoría de los usos prácticos no importan. Si desea que la imagen sea más grande (por ejemplo) en una página web, puede configurar los atributos de alto y ancho. Si está exportando a un archivo PNG, puede establecer las dimensiones como desee. De hecho, ni siquiera se requiereheight que los atributos y estén allí. Si la altura o el ancho no se especifican en el elemento raíz , simplemente se establecerán de forma predeterminada en 100 %.width<svg>

Jugar con el alto y el ancho realmente pierde uno de los grandes beneficios de los archivos SVG, que es la escalabilidad.

Pero si realmente quieres hacerlo...

Puede haber casos en los que realmente necesite establecer la altura y el ancho de un archivo SVG, pero en mi opinión, esto generalmente se debe a una limitación en su flujo de trabajo o herramientas.

Los archivos SVG son solo archivos XML: puede abrir uno en un editor de texto y echar un vistazo. Puede manipularlos como lo haría con cualquier otro archivo XML. Mozilla Dev Network tiene una referencia fantástica para aprender sobre el lado XML de los archivos SVG.

Para manipular un archivo XML, el método tradicional es usar XSL, un lenguaje de hojas de estilo para transformar un archivo XML en otra cosa (generalmente otro archivo XML).

Ejemplo

Cree un archivo de texto llamado scale-svg.xsl e inserte el siguiente contenido:

<xsl:stylesheet version="1.0">
    <xsl:output method="xml"/>
    <xsl:template match="svg:svg">
        <xsl:copy>
            <xsl:copy-of select="svg:metadata|svg:defs|sodipodi:namedview"/>
            <xsl:element name="svg:g">
                <xsl:attribute name="transform">
                    <xsl:value-of select="concat(concat('scale(',$scale),')')"/>
                </xsl:attribute>
                <xsl:copy-of select="*[not(svg:metadata|svg:defs|sodipodi:namedview)]"/>
            </xsl:element>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Ahora necesita aplicar la hoja de estilo a un archivo (o archivos) SVG. Hay muchos programas XSLT disponibles. Si está utilizando Linux, xlstprocprobablemente ya esté instalado.

# This command will scale small.svg up by 3x
$ xsltproc --stringparam scale 3 scale-svg.xsl small.svg>big.svg

# This command will scale all SVG files in the current directory
$ for f in *.svg; do xsltproc --stringparam scale 3 scale-svg.xsl $f>3x_$f; done 

Si desea hacer algo diferente (como manipular la altura y el ancho del documento SVG en lugar de escalarlo), deberá modificar el archivo XSL para satisfacer sus necesidades. Hay muchos tutoriales sobre XSL, como este en W3Schools .

También hay otros enfoques que usted toma. Una búsqueda rápida en Google también encontró svg-resizer , que es un enfoque basado en JavaScript que usa rsvg. Probablemente también pueda hacer que ImageMagick haga esto también.

¿Puede Inkscape hacer esto por mí?

Si bien Inkscape tiene capacidades de procesamiento por lotes, no creo que pueda hacer esto (nuevamente, las dimensiones de un archivo SVG son sugerencias, por lo que la utilidad es limitada).

Inkscape tiene la capacidad de automatizar la exportación de archivos SVG en diferentes tamaños. Las opciones de la línea de comandos de Inkscape tienen la capacidad de establecer manualmente la altura y el ancho al exportar un archivo PNG.

error de compilación: file scale-svg.xsl line 1 element xsl:stylesheet xsltParseStylesheetProcess: el documento no es una hoja de estilo
Hay situaciones en las que algunas utilidades de línea de comandos (spritezero, por ejemplo) convierten svg en imágenes rasterizadas utilizando los atributos viewBox, ancho y alto de svg, por lo que estos atributos (y las coordenadas de la ruta) no siempre son solo sugerencias.
scale-svg.xsl:1: namespace error : Namespace prefix xsl on stylesheet is not defined
"No lo hagas" es demasiado amplio, para algunos casos de uso. Si Bob tiene un montón de archivos SVG de diferentes tamaños y se los da a Alice, es posible que Alice tenga que cambiar el tamaño de cada uno manualmente, cuando lo use, como se sugiere en esta respuesta. Puede ser mucho más fácil cambiar el tamaño de todos usando un script de línea de comandos , para que Alice pueda "conectar y usar", sin tener que cambiar el tamaño de cada uno individualmente a las dimensiones necesarias. Tiene razón, este es un problema de flujo de trabajo, pero muchos flujos de trabajo no cambian automáticamente el tamaño de los SVG (el mío no lo hace).
⚠️ Nota: ImageMagick.org afirma que no puede cambiar el tamaño de los SVG sin pérdidas , porque hay un paso intermedio: la rasterización. Consulte "Una palabra sobre los formatos de imagen vectorial" en Imagemagick.org , pero no estoy seguro de si esto sigue siendo cierto a partir de 2021.