Redimensionar archivos .svg por lotes

Tengo una carpeta (original_svg_files) con más de diez mil archivos .svg de diferentes tamaños y necesito redimensionar cada uno de ellos. El nombre debe ser el mismo que el del archivo .svg original y el lado más largo debe ser de 150 px y también necesito mantener la relación de aspecto (restringir las proporciones).

Traté de usar Adobe Illustrator para hacer eso, pero no puedo entender cómo, ya que solo admite la transformación a través de un porcentaje. ¡Necesito automatizar este proceso mediante la línea de comandos o Automator ya que lo que estoy haciendo ahora realmente consume mucho tiempo!

Estoy usando OS X El Capitan versión 10.11.1.

¿Alguna sugerencia?

Respuestas (3)

Parece que la opción -fit en esta utilidad de línea de comando hará exactamente lo que desea:

https://github.com/vieron/svg-resizer

Si necesita ayuda con brew, busque aquí: http://coolestguidesontheplanet.com/installing-homebrew-os-x-yosemite-10-10-package-manager-unix-apps/

Si no te sientes cómodo con la línea de comandos, no dejes que te intimide, en realidad no es tan difícil. Vuelve a publicar si te quedas atascado o algo simplemente no tiene sentido.

Estoy bastante seguro de que puede usar ImageMagick para hacer lo que necesita. Hay un paquete homebrew para Imagemagick (homebrew es el equivalente Mac de apt-get). Así que después de un rápido:

brew install imagemagick

Debería poder utilizar las utilidades de la línea de comandos para ello. Parece que el comando de conversión debería hacer el cambio de tamaño con la escala proporcional que desea.

convert oldimage.svg -resize "150>" oldimage.svg

Este comando dice que se reduzca la imagen para que el lado más largo sea 150. El resto es solo usar secuencias de comandos de shell estándar para obtener el efecto deseado.

Esto rompió el formato SVG para mí. Agrega etiquetas xml y doctype y la imagen ya no se muestra correctamente en un navegador web.
esto rasteriza el svg

No sé si esto también funciona para Mac Shell, pero escribí el siguiente script bash basado en la información del foro de Inkscape :

Básicamente, toma todos los archivos svg y busca los atributos del cuadro de visualización de svg, agregando ancho y alto y un contenedor de grupo para cambiar el tamaño/reducir los elementos originales.

#!/bin/bash

for folder in $(ls -d [A-Z]*);
do 
  echo "$folder";
  mkdir -p resized/$folder; 
  for svgfile in $(ls $folder/*); 
  do 
    echo "$svgfile"; 
    cat "$svgfile" | \
      sed 's/viewBox="0 0 161.9 162" enable-background="new 0 0 161.9 162" xml:space="preserve">/width="41px" height="41px" viewBox="0 0 41 41" enable-background="new 0 0 41 41" xml:space="preserve">\n<g transform="scale(0.25)">/g' | \
      sed 's/<\/svg>/<\/g>\n<\/svg>/g' \
      > resized/$svgfile;
  done;
done

YMMV dependiendo de si todos sus archivos svg usan el mismo cuadro de vista original, el mío lo hizo.

¿Por qué $(ls $folder/*)(que se romperá si algunos nombres de archivo contienen espacios en blanco) en lugar de $folder/*?