Jak mogę skalować SVG za pomocą wiersza poleceń?

17

Plik SVG ma następujące właściwości, które określają jego rozmiar:

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

Chciałbym przeskalować dany plik SVG do z za 400ptpomocą wiersza poleceń bez przerywania proporcji. Oznacza to, że powyższe trzy wartości muszą zostać poprawnie zmienione, a wszystkie punkty w poniższym kodzie svg. Nie chcę zmieniać tylko rozmiaru płótna, ale cały rozmiar obrazu svg. I nie chcę tego robić z GUI / ręcznie, ale chcę to robić z CLI.

Jak mogę automatycznie przeskalować plik SVG za pomocą wiersza polecenia do określonej szerokości?

Powód: Podgląd Wikipedii wygląda źle, jeśli obraz jest zbyt mały. Zobacz ten obraz jako przykład.

Jak zrobiłbym to zadanie za pomocą Inkscape-GUI

  1. Shift + Ctrl + M (Przekształć)
  2. Skala (zaznacz „skaluj proporcjonalnie”)
  3. Wpisz szerokość
  4. Shift + Ctrl + D (właściwości dokumentu)
  5. Dopasuj stronę do wyboru

Teraz chcę to zrobić za pomocą automatycznego interfejsu CLI.

Nawiasem mówiąc, po prostu zastosowano Inkscape

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

do całego obrazu.

Martin Thoma
źródło
Z jakiego systemu operacyjnego korzystasz?
terdon
Ubuntu 10.04.4 LTS (zamierzam go zaktualizować ...)
Martin Thoma,
Pliki SVG to tylko pliki tekstowe. Możesz być w stanie edytować plik i zmienić width, heighti viewBoxwartości do czegoś podobnego width="100%" height="100%" viewBox="0 0 400 212.58569".
martineau,
Wiem, że to tylko pliki tekstowe. Ale jeśli edytuję tylko te wartości, rozmiar obrazu nie zmienia się. Zmienia się tylko rozmiar obszaru roboczego. Ręczna edycja nie jest opcją, wyraźnie stwierdziłem, że chcę to zmienić automatycznie.
Martin Thoma,
Tak, wiem, że poprosiłeś o zautomatyzowany sposób na zrobienie tego, ale pomyślałem, że jeśli możesz dowiedzieć się, co zmienić, pod względem tekstowym, możesz zautomatyzować go za pomocą dowolnego z wielu dostępnych narzędzi do edycji tekstu (takich jak jak sedw odpowiedzi @ terdon). Jednym z problemów, na które możesz natknąć się, jest to, że wartości mogą być inne w przypadku innych plików .svg, z którymi chcesz zrobić to samo.
martineau,

Odpowiedzi:

15

rsvg-convertz librsvg2-binpakietu można zmienić rozmiar pliku svg.

Zobacz tę odpowiedź, aby uzyskać pełne instrukcje.

niebieski szary
źródło
4
rsvg-convert -a -w 500 -f svg Vector-triangle-inequality.svg -o Result.svgpracował Ale rsvg-convert wydaje się robić coś więcej niż tylko zmianę rozmiaru.
Martin Thoma,
2
@moose jednak, jak zauważono w tej odpowiedzi, rsvg-convert używa punktów, a nie pikseli. Jeśli masz szczęście, możesz po prostu podzielić swój zamierzony rozmiar przez 1,25. Jeśli jednak chcesz czegoś w rodzaju 24px (19,2 w punktach), nie masz szczęścia, ponieważ nie chcesz podawać liczby całkowitej jako szerokości lub wysokości (nie jestem pewien, czy SVG na to pozwala).
Matthew Flaschen
@MartinThoma Tak, rzeczywiście. Plik wyjściowy SVG jest około dwa razy większy niż oryginalny rozmiar. Zastanawiam się dlaczego? Czytanie rsvg-convert --helpnie dostarcza żadnych wskazówek.
Serge Stroobandt
1
rsvg convert wydaje się również konwertować obrysowane ścieżki na zarysowane ścieżki. Możesz tego nie chcieć (wiem, że nie)
szurać
1
Wydaje się, że to narzędzie zacina przekształcenia w każdy element i nie zmienia oryginalnych rozmiarów.
rtaft
3

Jeśli chcesz tylko zmienić jeden obraz, otwórz go w edytorze tekstu (na przykład emacs) i zmień szerokość.

Dla geekierów, podejście tylko CLI, użyj sed:

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

Nie spowoduje to jednak skalowania obrazu, a jedynie jego szerokość.


Być może lepszym sposobem, ale z pewnością takim, który można uruchomić w trybie wsadowym dla wielu obrazów, jest użycie programu inkscape z wiersza poleceń:

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

W przypadku wielu plików (zakładając, że chcesz, aby wszystkie miały tę samą szerokość), wykonaj następujące czynności. Wymaga konwersji na png i zakłada, że ​​w nazwach plików nie ma spacji:

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

Konwersja ImageMagick była moim pierwszym wyborem, ale wydaje się, że psuje się podczas skalowania plików svg.

terdon
źródło
7
Twoje polecenie inkscape powoduje utworzenie pliku PNG, ale chcę plik SVG. Twoje polecenie svg zmienia tylko rozmiar obszaru roboczego, ale nie rozmiar obrazu. Nie możesz po prostu użyć edytora tekstu i zmienić tylko wartości, o których wspomniałem powyżej. Myślę, że muszę wyjaśnić pytanie.
Martin Thoma,
trzeba także dodać tag: ... "> <g przekształcić =" skala (2) "> <path .... /> </ B> </ svg> skalować obraz z tego samego czynnika.
Stofke,