Wie kann ich eine SVG über die Befehlszeile skalieren?

17

Ein SVG hat diese Eigenschaften, die seine Größe bestimmen:

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

Ich möchte eine gegebene SVG auf eine mit von 400ptper Kommandozeile skalieren , ohne das Seitenverhältnis zu brechen. Dies bedeutet, dass die drei oben genannten Werte korrekt geändert werden müssen und alle Punkte im folgenden SVG-Code. Ich möchte nicht nur die Leinwandgröße ändern, sondern die gesamte SVG-Bildgröße. Und ich möchte es nicht mit einer GUI / von Hand machen, aber ich möchte es mit der CLI machen.

Wie kann ich eine SVG-Datei automatisch über die Befehlszeile auf eine bestimmte Breite skalieren?

Grund: Die Vorschau von Wikipedia sieht schlecht aus, wenn das Bild zu klein ist. Sehen Sie sich dieses Bild als Beispiel an.

Wie würde ich diese Aufgabe mit Inkscape-GUI machen

  1. Umschalt + Strg + M (Transformieren)
  2. Skalieren ("Proportional skalieren" ankreuzen)
  3. Breite eingeben
  4. Umschalt + Strg + D (Dokumenteigenschaften)
  5. Seite an Auswahl anpassen

Jetzt möchte ich eine automatische CLI-Methode, um dies zu tun.

Übrigens, inkscape wurde einfach angewendet

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

zum ganzen Bild.

Martin Thoma
quelle
Welches Betriebssystem benutzt du?
Terdon
Ubuntu 10.04.4 LTS (Ich werde es aktualisieren ...)
Martin Thoma
SVG-Dateien sind nur Textdateien. Sie können die Datei bearbeiten können , und ändern Sie die width, heightund viewBoxWerte zu so etwas wie width="100%" height="100%" viewBox="0 0 400 212.58569".
Martineau
Ich weiß, dass es sich nur um Textdateien handelt. Wenn ich jedoch nur diese Werte bearbeite, ändert sich die Größe des Bildes nicht. Nur die Leinwandgröße ändert sich. Das Bearbeiten von Hand ist keine Option, ich habe ausdrücklich erklärt, dass ich es automatisch ändern möchte.
Martin Thoma
Ja, ich weiß, dass Sie nach einer automatisierten Methode gefragt haben, aber Sie dachten, wenn Sie herausfinden könnten, was Sie textuell ändern sollten, könnten Sie dies mit einem der verfügbaren Textbearbeitungswerkzeuge automatisieren (z. B. wie sedin @ terdons Antwort). Ein Problem, auf das Sie stoßen können, besteht darin, dass die Werte möglicherweise von allen anderen .svg-Dateien abweichen müssen, mit denen Sie dasselbe tun möchten.
Martineau

Antworten:

15

rsvg-convertaus dem librsvg2-binpaket können svg's in der größe ändern.

In dieser Antwort finden Sie ausführliche Anweisungen.

Blau grau
quelle
4
rsvg-convert -a -w 500 -f svg Vector-triangle-inequality.svg -o Result.svghat funktioniert. Aber rsvg-convert scheint mehr zu können als nur die Größe zu ändern.
Martin Thoma
2
@ Elch, jedoch, wie in dieser Antwort erwähnt, verwendet rsvg-convert Punkte, keine Pixel. Wenn Sie Glück haben, können Sie einfach Ihre beabsichtigte Größe durch 1,25 teilen. Wenn Sie jedoch etwas wie 24px (19,2 in Punkten) möchten, haben Sie Pech, da es nicht erwünscht ist, eine Nicht-Ganzzahl als Breite oder Höhe anzugeben (nicht sicher, ob SVG dies zulässt).
Matthew Flaschen
@MartinThoma Ja, in der Tat. Die SVG-Ausgabedatei ist ungefähr doppelt so groß wie das Original. Ich wundere mich warum? Lesen rsvg-convert --helpliefert keine Hinweise.
Serge Stroobandt
1
rsvg convert scheint auch gestrichene Pfade in umrissene Pfade umzuwandeln. Vielleicht möchten Sie das nicht (ich weiß, ich weiß nicht)
scruss
1
Dieses Tool scheint nur Transformationen in jedes Element zu blockieren und ändert die ursprünglichen Größen nicht.
Floß
3

Wenn Sie nur ein Bild ändern möchten, öffnen Sie es in einem Texteditor (z. B. Emacs) und ändern Sie die Breite.

Verwenden Sie für einen geekier CLI-Ansatz sed:

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

Dadurch wird das Bild jedoch nicht skaliert, sondern nur die Breite eingestellt.


Eine bessere Möglichkeit, die für viele Bilder im Batch-Modus ausgeführt werden kann, ist die Verwendung von inkscape über die Befehlszeile:

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

Führen Sie für viele Dateien (vorausgesetzt, Sie möchten, dass alle Dateien die gleiche Breite haben) die folgenden Schritte aus. Es erfordert die Konvertierung in PNG und setzt voraus, dass Ihre Dateinamen keine Leerzeichen enthalten:

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

Der Konverter von ImageMagick war meine erste Wahl, aber er scheint beim Skalieren von SVGs zu scheitern.

terdon
quelle
7
Ihr inkscape-Befehl führt zu einer PNG, aber ich möchte eine SVG. Ihr SVG-Befehl ändert nur die Leinwandgröße, nicht jedoch die Größe des Bildes. Sie können nicht einfach einen Texteditor verwenden und nur die oben genannten Werte ändern. Ich denke, ich muss die Frage klären.
Martin Thoma
Sie müssen auch ein Tag hinzufügen: ... "> <g transform =" scale (2) "> <path .... /> </ g> </ svg>, um das Bild mit demselben Faktor zu skalieren.
Stofke