Jak dopasować rysunki SVG do ich kanwy w wierszu poleceń?

13

Przycinanie .svgplików w wierszu poleceń jest proste: $ inkscape --verb=FitCanvasToDrawing --verb=FileSave --verb=FileClose *.svg

Muszę zrobić odwrotnie. Chcę dopasować rysunek do 64 x 64kanwy punktów (już ustawionej we wszystkich .svgplikach). Niestety Inkscape nie udostępnia FitDrawingToCanvaspolecenia. Ponadto dopasowanie powinno zachować proporcje rysunku.

Jeśli to ważne: używam Ubuntu raring.

Stefan Endrullis
źródło
1
Czy zmiana rozmiaru po dopasowaniu płótna do rysunku wystarczy? Zobacz graphicdesign.stackexchange.com/questions/6574/...
Takkat
Dwa pytania: (1) rozmiar płótna jest już ustawiony w każdym przypadku, ale rysunki są większe niż płótno; czy wstawiasz rysunek svg do innego dokumentu svg ?; (2) „zachowaj współczynnik proporcji”: jest to mylące w świetle 64-kwadratowego płótna wspomnianego w twoich pytaniach, ale czy masz zaproponowany zautomatyzowany proces decyzyjny dotyczący postępowania z materiałem innym niż kwadrat? np. wysokość powinna wynosić 64pt we wszystkich przypadkach ...
horatio
@Takkat: Dzięki za podpowiedź. Przepływ pracy działa, ale proporcje zostają zniszczone.
Poszukuje
@horatio: (1) rysunek jest mniejszy niż płótno i tak, oba są w tym samym pliku. (2) Chcę przeskalować rysunek do punktu, w którym max (drawingWidth, drawingHeight) = 64pt.
Stefan Endrullis
@Takkat: rsvg-convert ma argument --keep-ratio-ratio :)
Stefan Endrullis

Odpowiedzi:

2

Znalazłem sposób na zrobienie tego w tym pytaniu: Inkscape - Wyśrodkuj rysunek na stronie za pomocą wiersza poleceń / terminala

Z „foo.svg” jako obrazem do edycji:

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

Aby edytować wszystkie obrazy svg w bieżącym katalogu:

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

Ale to drugie polecenie otwiera mnóstwo okien, co spowoduje awarię komputera, jeśli edytujesz zbyt wiele obrazów. Tylko w systemie Linux to polecenie będzie działać lepiej:

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

W przypadku powyższego polecenia, jeśli którykolwiek z plików jest dowiązaniami symbolicznymi, Inkscape edytuje plik docelowy, na który wskazuje dowiązanie symboliczne. Jeśli nie chcesz, aby Inkscape to zrobił, możesz odfiltrować wszelkie dowiązania symboliczne za pomocą tego polecenia:

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 tym momencie równie dobrze mogę opublikować skrypt bash, który dla tego stworzyłem:

#!/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

Zadzwoniłem inkscape-centeri uruchomiłem tak:

inkscape-center <file-or-directory>

Wymaga tyle argumentów, ile chcesz, więc możesz zrobić coś takiego:

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

Uważaj - jeśli podasz katalog zamiast pliku, będzie on edytować każdy plik svg w tym katalogu.

GreenRaccoon23
źródło
1

Możesz użyć viewBox do osiągnięcia tego, co chcesz. Nie wiem, czy można to zrobić z poziomu Inkscape, ale ponieważ SVG jest standardowym formatem i może istnieć inne narzędzie, które wykona zadanie, które chcesz. Szybkie wyszukiwanie „narzędzi wiersza polecenia svg” ujawniło kilka interesujących wyników, w tym do tworzenia ikon CSS.

Drugą opcją byłoby napisanie własnego narzędzia w wybranym języku, aby to zrobić. Podstawową zasadą jest ustawienie viewBox na wysokość dokumentu, a następnie ustawienie pożądanej szerokości i wysokości dokumentu. Na koniec ustaw atrybut preserveAspectRatio.

Oto jak opisane powyżej modyfikacje wyglądają w dokumencie, który pierwotnie miał format 744x1052.

<svg
   width="64"
   height="64"
   viewBox="0 0 744 1052"
    preserveAspectRatio="xMinYMin slice"
BrianV
źródło