Comment mettre à l'échelle un SVG via la ligne de commande?

17

Un SVG a ces propriétés, qui déterminent sa taille:

width="146.91299pt"
height="78.079002pt"
viewBox="0 0 146.913 78.079"

Je voudrais mettre à l'échelle un SVG donné à une 400ptligne de commande avec ou sans casser le rapport d'aspect. Cela signifie que les trois valeurs ci-dessus doivent être modifiées correctement et tous les points dans le code svg suivant. Je ne veux pas changer seulement la taille de la toile, mais la taille de l'image svg entière. Et je ne veux pas le faire avec une interface graphique / à la main, mais je veux le faire avec CLI.

Comment puis-je redimensionner automatiquement un SVG par ligne de commande à une largeur donnée?

Raison: l'aperçu de Wikipédia est mauvais si l'image est trop petite. Voyez cette image comme exemple.

Comment je ferais cette tâche avec Inkscape-GUI

  1. Maj + Ctrl + M (Transformation)
  2. Échelle (cochez "échelle proportionnelle")
  3. Entrez la largeur
  4. Maj + Ctrl + D (Propriétés du document)
  5. Ajuster la page à la sélection

Maintenant, je veux une méthode CLI automatique pour le faire.

Soit dit en passant, inkscape a simplement appliqué

<g transform="matrix(1.6838397,0,0,1.6838397,-3.3543029,-3.3542794)"
 id="surface0">

à l'image entière.

Martin Thoma
la source
Quel OS utilisez-vous?
terdon
Ubuntu 10.04.4 LTS (je vais le mettre à jour ...)
Martin Thoma
Les fichiers SVG ne sont que des fichiers texte. Vous pourrez peut - être modifier le fichier et changer les width, heightet les viewBoxvaleurs à quelque chose comme width="100%" height="100%" viewBox="0 0 400 212.58569".
martineau
Je sais que ce ne sont que des fichiers texte. Mais si je modifie uniquement ces valeurs, la taille de l'image ne change pas. Seule la taille du canevas change. L'édition à la main n'est pas une option, j'ai explicitement déclaré que je voulais la changer automatiquement.
Martin Thoma
Oui, je sais que vous avez demandé un moyen automatisé de le faire, mais que vous pensiez que si vous pouviez trouver quoi changer, au niveau du texte, vous pourriez l'automatiser à l'aide de l'un des nombreux outils d'édition de texte disponibles (tels que comme seddans la réponse de @ terdon). Un problème que vous pouvez rencontrer est que les valeurs doivent être différentes de celles des autres fichiers .svg auxquels vous souhaitez faire la même chose.
martineau

Réponses:

15

rsvg-convertà partir du librsvg2-binpackage peut redimensionner les svg.

Voir cette réponse pour des instructions complètes.

bleu-gris
la source
4
rsvg-convert -a -w 500 -f svg Vector-triangle-inequality.svg -o Result.svgtravaillé. Mais rsvg-convert semble faire plus que redimensionner.
Martin Thoma
2
@moose, cependant, comme indiqué dans cette réponse, rsvg-convert utilise des points, pas des pixels. Si vous êtes chanceux, vous pouvez simplement diviser votre taille prévue par 1,25. Cependant, si vous voulez quelque chose comme 24px (19,2 points), vous n'avez pas de chance, car il n'est pas disposé à mettre un non entier comme largeur ou hauteur (je ne sais pas si SVG le permet).
Matthew Flaschen
@MartinThoma Oui, en effet. Le fichier de sortie SVG est environ le double de la taille d'origine. Je me demande pourquoi? La lecture rsvg-convert --helpne fournit aucun indice.
Serge Stroobandt
1
rsvg convert semble également convertir les chemins tracés en chemins tracés. Vous ne voudrez peut-être pas cela (je sais que je ne le fais pas)
scruss
1
Cet outil semble simplement bloquer les transformations dans chaque élément et ne change pas réellement les tailles d'origine.
rtaft
3

Si vous voulez juste changer une image, ouvrez-la dans un éditeur de texte (emacs par exemple) et changez l'entrée de largeur.

Pour une approche plus geek, CLI uniquement, utilisez sed:

$ sed 's/width=\"146.91299pt\"/width=\"400pt\"/' orig.svg > new.svg

Cela ne mettra cependant pas l'image à l'échelle, mais uniquement sa largeur.


Une meilleure façon, peut-être, mais certainement une qui peut être exécutée en mode batch pour de nombreuses images, utilise inkscape à partir de la ligne de commande:

$ inkscape -z -e out.png -w 400 -h 400 in.svg

Pour de nombreux fichiers (en supposant que vous souhaitiez qu'ils aient tous la même largeur), procédez comme suit. Il nécessite une conversion en png et suppose qu'il n'y a pas d'espace dans vos noms de fichiers:

$ for n in $(ls *svg | sed 's/.svg//'); do inkscape -z -e $n.png -w 400 -h 400 $n.svg; done

La conversion d' ImageMagick a été mon premier choix, mais il semble rompre lors de la mise à l'échelle des svgs.

terdon
la source
7
Votre commande inkscape donne un PNG, mais je veux un SVG. Votre commande svg ne modifie que la taille du canevas, mais pas la taille de l'image. Vous ne pouvez pas simplement utiliser un éditeur de texte et modifier uniquement les valeurs que j'ai mentionnées ci-dessus. Je pense que je dois clarifier la question.
Martin Thoma
vous devez également ajouter une balise: ... "> <g transform =" scale (2) "> <path .... /> </g> </svg> pour mettre à l'échelle l'image avec le même facteur.
Stofke