Wie passt man SVG-Zeichnungen auf der Kommandozeile an die Leinwand an?

13

Das Zuschneiden von .svgDateien in der Befehlszeile ist einfach: $ inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Ich muss das Gegenteil tun. Ich möchte die Zeichnung in einen 64 x 64Punktebereich einpassen (in allen .svgDateien bereits festgelegt ). Leider bietet Inkscape keinen FitDrawingToCanvasBefehl an. Darüber hinaus sollte die Armatur das Seitenverhältnis der Zeichnung beibehalten.

Wenn es darauf ankommt: Ich benutze Ubuntu raring.

Stefan Endrullis
quelle
1
Würde die Größe nach dem Anpassen der Leinwand an die Zeichnung den Job machen? Siehe graphicdesign.stackexchange.com/questions/6574/…
Takkat
Zwei Fragen: (1) Die Leinwandgröße ist in jedem Fall bereits festgelegt, aber die Zeichnungen sind größer als die Leinwand; oder fügen Sie eine SVG-Zeichnung in ein anderes SVG-Dokument ein ?; (2) "Seitenverhältnis beibehalten": Dies ist im Lichte der in Ihren Fragen erwähnten 64pt-Leinwand verwirrend. Haben Sie jedoch ein automatisiertes Entscheidungsverfahren für den Umgang mit nicht quadratischem Material vorgeschlagen? ZB sollte die Höhe in jedem Fall 64pt sein ...
Horatio
@Takkat: Danke für den Hinweis. Der Workflow funktioniert, aber das Seitenverhältnis wird zerstört. Wird nach einer Lösung dafür suchen ...
Stefan Endrullis
@horatio: (1) Die Zeichnung ist kleiner als die Leinwand und ja, beide befinden sich in derselben Datei. (2) Ich möchte die Zeichnung so skalieren, dass max (drawingWidth, drawingHeight) = 64pt.
Stefan Endrullis
@ Takkat: rsvg-convert hat ein Argument - Keep-Seitenverhältnis :)
Stefan Endrullis

Antworten:

2

In dieser Frage habe ich einen Weg gefunden, dies zu tun: Inkscape - Zeichnen auf Seite über die Befehlszeile / das Terminal zentrieren

Mit "foo.svg" als zu bearbeitendem Bild:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit foo.svg

So bearbeiten Sie alle SVG-Bilder im aktuellen Verzeichnis:

inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileClose *.svg

Aber dieser zweite Befehl öffnet eine Menge Fenster, die Ihren Computer zum Absturz bringen, wenn Sie zu viele Bilder bearbeiten. Für Linux nur , wird dieser Befehl besser funktionieren:

for img in $(ls *.svg) ; do inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; done

Wenn es sich bei dem obigen Befehl um Symlinks handelt, bearbeitet Inkscape die Zieldatei, auf die der Symlink verweist. Wenn Sie nicht möchten, dass Inkscape dies tut, können Sie mit diesem Befehl alle Symlinks herausfiltern:

for img in $(ls *.svg) ; do if [[ $(readlink $img) == "" ]] ; then inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit $img ; fi ; done


Während ich dabei bin, könnte ich genauso gut das Bash-Skript posten, das ich dafür erstellt habe:

#!/bin/bash
# inkscape-center <file-or-directory>...

_analyse() {
    if [ -d "${1}" ] ; then
        _centerAll "${1}" ;
    else
        _center "${1}" ;
    fi
}

_centerAll() {
    cd "${1}" ;
    for img in $(ls "*.svg") ; do
        _filterSyms "${img}" ;
    done
}

_filterSyms() {
    if [[ $(readlink "${1}") == "" ]] ; then
        _center "${1}"
    fi
}

_center() {
    inkscape --verb=EditSelectAll --verb=AlignHorizontalCenter --verb=AlignVerticalCenter --verb=FileSave --verb=FileQuit "${1}"
}

for arg ; do
    _analyse "${arg}" ;
done

Ich habe es so genannt inkscape-centerund ausgeführt:

inkscape-center <file-or-directory>

Es sind so viele Argumente erforderlich, wie Sie möchten, sodass Sie Folgendes tun können:

inkscape-center 1st.svg 2nd.svg 3rd.svg 4th.svg

Vorsicht - Wenn Sie anstelle einer Datei ein Verzeichnis angeben, wird jede SVG-Datei in diesem Verzeichnis bearbeitet.

GreenRaccoon23
quelle
1

Sie könnten viewBox verwenden , um das zu erreichen, was Sie wollen. Ich weiß nicht, ob es eine Möglichkeit gibt, dies in Inkscape zu tun, aber da SVG ein Standardformat ist und es möglicherweise ein anderes Tool gibt, das die gewünschte Arbeit leistet. Eine schnelle Suche nach "svg command line tools" ergab einige interessante Ergebnisse, darunter dieses zur Erstellung von CSS-Symbolen.

Eine zweite Möglichkeit wäre, ein eigenes Tool in der Sprache Ihrer Wahl zu schreiben, um dies zu tun. Der Grundgedanke besteht darin, die viewBox auf die Höhe Ihres Dokuments einzustellen und dann die Breite und Höhe des Dokuments festzulegen, das gewünscht wird. Legen Sie abschließend das Attribut preserveAspectRatio fest.

So sehen die oben beschriebenen Änderungen in einem Dokument aus, das ursprünglich 744 x 1052 Pixel groß war.

<svg
   width="64"
   height="64"
   viewBox="0 0 744 1052"
    preserveAspectRatio="xMinYMin slice"
BrianV
quelle