Usuwanie przekształceń w plikach SVG


155

Od jakiegoś czasu zmagam się z tym i nie mogę znaleźć odpowiedzi (która działa) nigdzie. Mam plik SVG, który wygląda tak:

<svg

   xmlns:dc="http://purl.org/dc/elements/1.1/"
   ...
   width="72.9375"
   height="58.21875"
   ...>
   ...
   <g
     ...
     transform="translate(10.75,-308.96875)"
     style="...">
     <path
       inkscape:connector-curvature="0"
       d="m -10.254587,345.43597 c 0,-1.41732 0.17692,-2.85384 0.5312502,-3.5625 0.70866,-1.41733 2.14518,-2.82259 3.5625,-3.53125 1.41733,-0.70866 2.11392,-0.70867 3.53125,0 1.41732,0.70866 ... z"
       ... />
  </g>
</svg>

Chcę usunąć transform="..."linię, ale nadal mam obraz w miejscu, w którym go umieściłem (w InkScape). Jeśli ręcznie usuwam transformację, obraz przeskakuje do innej części ekranu (zgodnie z oczekiwaniami), ale muszę całkowicie pozbyć się transformacji, a jednocześnie pozostawić obraz dokładnie tam, gdzie chcę. Czy istnieje sposób, aby usunąć / spłaszczyć transformacje do samych współrzędnych ścieżki? (Jedyne transformacje, z którymi mam do czynienia, to translacja i skala, bez macierzy.)



Odpowiedzi:


149

Jak usunąć transformacje w Inkscape

  1. Otwórz plik SVG w Inkscape
  2. Przejdź do Edycja -> Edytor XML
  3. Znajdź atrybuty „transformuj” w warstwach i usuń je

Jak całkowicie przenieść wszystkie obiekty bez tworzenia kolejnych atrybutów transformacji

  1. Idź do Edycja -> Zaznacz wszystko we wszystkich warstwach
  2. Idź do Object -> Transform

    W panelu Przekształć

  3. Usuń zaznaczenie opcji Ruch względny i zaznacz Zastosuj do każdego obiektu oddzielnie

  4. Ustaw wartości w poziomie i pionie zgodnie ze swoimi potrzebami i kliknij Zastosuj

16
Pracował dla mnie. Obiekty należy rozgrupować przed ich przekształceniem, aby zaktualizować rzeczywiste współrzędne ścieżek.
Rupert Angermeier

8
Hm, po ustawieniu go na 0 i kliknięciu zastosuj transformację ponownie pojawi się w edytorze XML.
uciekł kot

7
Rozgrupowanie obiektów jest konieczne, aby to zadziałało, dzięki!
Hai Zhang

1
Nie działa dla mnie. Spłaszcza i przenosi atrybut transform na liście (właściwie wszystko staje się liściem po rozgrupowaniu), ale nie USUWA atrybutu transform i nie zastosuje go do wskazania GEOMETRII, bez której jestem z powrotem na pierwszym miejscu.
Szczepan Hołyszewski

2
WAŻNE: Podobnie jak w powyższym komentarzu, musisz rozgrupować obiekty, aby to działało poprawnie, w przeciwnym razie atrybut transform zostanie ustawiony ponownie automatycznie
Shadow

52

Wykryłem, na czym polega problem. Miałem nadzieję, że nie będę musiał uciekać się do odpowiedzi Roberta, chociaż cieszę się z potwierdzenia, że ​​to zadziała! Ostatecznie odpowiedź Duopixel była właściwie najbliższa, choć okazuje się, że działo się coś innego.

Kiedy pracujesz z różnymi ścieżkami w dokumentach Inkscape, uważam, że ich domyślnym zachowaniem jest zgrupowanie ich razem pod <svg:g.../>tagiem. Podczas modyfikowania ścieżek w grupie Inkscape automatycznie doda transformację do grupy, aby przedstawić te zmiany. Jeśli jednak otworzysz edytor XML i przeciągniesz ścieżkę poza <svg:g.../>znacznik i utworzysz własny <svg:path.../>znacznik, Inkscape może dowolnie edytować poszczególne punkty. Ostatecznie okazało się, że był to problem z grupowaniem, mimo że pracowałem tylko z jedną ścieżką! Mam nadzieję, że pomoże to innym w podobnych sytuacjach.


7
Niesamowite! Dziękuję Ci! Dokładnie to robił. Właśnie usunąłem tag grupy, pozostawiając wewnętrzną zawartość, zapisałem go i ponownie otworzyłem w inkscape. Oczywiście obraz znajdował się poza polem widoku (lub jakkolwiek to się nazywa), ale potem po prostu ustawiam x, y i jest naprawiony. Co za ból. Dziękuję za udostępnienie tego!
johntrepreneur,

1
W moim przypadku połączyłem podejścia z tej odpowiedzi z innym z tamtej odpowiedzi .
quasiyoke

Należy to poprzeć i postawić na szczycie. To elegancko rozwiązuje problem i działa dla mnie. I nawet jeśli grafika jest umieszczona w niewłaściwym miejscu poza obszarem roboczym, zawsze możesz zmienić jej rozmiar (Edycja> Zmień rozmiar strony na zaznaczenie)
mandarynka

48

wprowadź opis obrazu tutaj

  1. Załaduj swój plik SVG w Method Draw http://editor.method.ac (Plik> Otwórz obraz)
  2. Rozgrupuj elementy (Obiekt> Rozgrupuj elementy), być może trzeba będzie to zrobić więcej niż raz.
  3. Wybierz swoją ścieżkę
  4. Zmień orientację ścieżki (Obiekt> Zmień orientację ścieżek).
  5. Zapisz swój obraz (Plik> Zapisz obraz) Jeśli pojawi się w nowym oknie, możesz kliknąć prawym przyciskiem myszy i „Zapisz obraz jako ...”

1
Nie ma obiektu> Zmień orientację ścieżek. Do której wersji się odnosisz?
0__

1
@ 0__ Jeśli ta pozycja menu jest wyłączona, oznacza to, że ścieżka nadal znajduje się w grupie. Rozgrupuj ponownie.
methodofaction

37

Istnieje rozszerzenie Inkscape o nazwie Apply Transforms które ponownie ścieżki wraz z ich transformacjami. To jest dokładnie to, czego szukałem.

Po zainstalowaniu znajdziesz go w menu pod Rozszerzenia> Modyfikuj ścieżkę> Zastosuj transformację .


kredyty: forum Inkscape> Usuń wszystkie transformacje, zachowując na miejscu


To rozszerzenie zostało zaktualizowane i teraz działa również dla prostokątów, przynajmniej w moich testach.
sil

Absolutnie. Moc, którą daje ta mała wtyczka, jest nie do zmierzenia!
brett

23

W przypadku grup przegrupowanie może szybko wykonać zadanie. Wybierz grupę i naciśnij Ctrl + Shift + G (degroup), a następnie Ctrl + G (grupa).

W przypadku niektórych obiektów, które mają podobny problem, na przykład spirale i gwiazdy, szybkim sposobem jest naciśnięcie Ctrl + Alt + C (obrys do ścieżki) - to jednak konwertuje obiekt na czystą ścieżkę i usuwa wszystkie dodatkowe atrybuty, takie jak sodipodi: cx, sodipodi: revolutions i tak dalej.


23

Otwórz plik SVG w Inkscape :

  • Wybierz grupę zawierającą wszystkie transformacje, których chcesz się pozbyć
  • Naciśnij CTRL+ U(rozgrupuj)
  • Naciśnij CTRL+ G(ponownie grupuj)

W ten sposób pozbędziesz się transformacji zastosowanych do grupy i zostaną one przeniesione na ścieżki zawarte w tej grupie.


1
Idealny! To działało w Inkscape 1.0
Wizard of Ogz

14

Z mojego doświadczenia wynika, że ​​jeśli używasz Inkscape, wystarczy nieznacznie przesunąć element ścieżki (np. Za pomocą klawiszy kursora), a Inkscape usunie atrybut transformacji i odpowiednio dostosuje dane ścieżki. (Irytujące, jeśli faktycznie chcesz zachować atrybut transformacji).

Możesz więc po prostu wybrać ścieżkę (upewnij się, że jest to ścieżka, a nie otaczająca ją grupa), nacisnąć prawy i lewy klawisz kursora i gotowe.


1
Wydaje się, że to nie działa dla elementu <g>. Próbuję pozbyć się atrybutu transformacji.
Max Spring

5
Może spróbuj najpierw rozgrupować, a potem przegrupować.
Thomas W

1
Wow, zadziałało jak urok! To powinna być akceptowana odpowiedź. Żadnych dodatkowych narzędzi, żadnych skomplikowanych czynności. Inne odpowiedzi nie działają, jeśli ścieżka jest zagnieżdżona w przekształconym <g>i chcę zachować przekształcenie w pliku <g>.
tomekwi

Nie działa również dla ścieżki utworzonej przez narzędzie okręgu
sdaau,

1
Najlepsza odpowiedź. Być może jednym ze źródeł nieporozumień jest opcja Preferencje> Transformacje> Przechowuj transformacje, o której nie ma mowy w innym miejscu tutaj. Powinien być ustawiony na „zoptymalizowany”. Następnie wystarczy rozgrupować, przenieść, ponownie zgrupować, a transformacje niewypałowe są usuwane.
Mr5o1

13

Chociaż wolę Inkscape, Affinity Designer (~ 40 USD / Mac) zaoszczędził mi wielu godzin pracy z Androidem Vector Drawables.

Otwórz plik SVG, Plik -> Eksportuj -> SVG -> Więcej -> Spłaszcz transformacje działały świetnie.

Projektant powinowactwa


12

SVGO to doskonałe narzędzie wiersza poleceń typu open source do tego i wielu innych optymalizacji. Jest dla niego równie doskonały internetowy interfejs użytkownika o nazwie SVGOMG

Odpowiednie opcje są w tym przypadku moveGroupAttrsToElems(SVGOMG: Move group attrs to elements) przenieść transformatrybuty z grup do elementów toru, plus convertPathData(SVGOMG: Round/rewrite paths) spłaszczyć transformsię d.


1
SVGO jest niesamowity. To naprawdę powinna być akceptowana odpowiedź, zwłaszcza że stackoverflow jest z punktu widzenia programisty i jest to zdecydowanie najlepsze rozwiązanie dla programisty tworzącego witrynę zawierającą SVG. Umieszczenie tego w potoku wdrażania jest o wiele lepsze niż konieczność uczenia artystów, jak usuwać transformacje ręcznie (lub konieczność robienia tego samodzielnie) i otrzymywanie raportu o błędzie za każdym razem, gdy o tym zapomną
UTF_or_Death

3
Tyle że to już nie działa. Pamiętam, że kiedyś działało lepiej, ale zobacz ten problem dotyczący tej dokładnej funkcji github.com/svg/svgo/issues/624 dla SVGO
morewry

9

Należy wspomnieć, że w preferencjach jest tryb „Zoptymalizowany”:

Inkscape Preferences> Transforms> Store Transforms> Optimized

Ma to na celu maksymalne zminimalizowanie występowania transformatrybutów (ale tego nie robi).

Wydaje się, że i tak jest domyślnie włączone.

Według dyskusji jednym z przypadków, w których w tym trybie zoptymalizowanym brakuje zapału, jest zmiana rozmiaru strony . Powoduje to zastosowanie translatetransformacji do <g>elementu warstwy . Wydaje się, że ewakuacja dzieci na inną warstwę jest w tej chwili najlepszym rozwiązaniem.


2
Aby zmienić rozmiar strony bez tworzenia irytujących translateprzekształceń na każdej warstwie, spróbuj otworzyć .svgplik w edytorze tekstu i manipulować atrybutami wysokości i szerokości, które pojawiają się u góry.
lutyInk

7

Inkscape ma opcję wyczyszczenia danych transformacji, ale nadal pozostawia niezmienioną wartość obiektu.

W Inkscape wybierz obiekt i menu „Ścieżka”, „Uprość”. Teraz będziesz mieć usunięte transformacje.


16
Zmieni to jednak kontury twoich ścieżek i zmniejszy liczbę wierzchołków w złożonych kształtach.
Charlie

1
To często sprawia, że ​​znaczniki są większe niż przed przekształceniami.
Charlie

6

W tym przypadku wystarczy dodać translację do m wartości dla każdego dziecka, więc -10,254587 + 10,75 = -0,504587 i -308,96875 + 345,43597 = 36,46722.

Ponieważ wszystkie terminy w przykładzie są względne (tj. Małymi literami), to wszystko. Gdyby którekolwiek były bezwzględne (wielkie litery), np. M lub C, musiałyby również zostać dostosowane.

W przypadku skali pomnożyłbyś w zasadzie wszystkie wartości potomne przez skalę.


Zrobiłem to, ale w edytorze Inkspace XML (lub jakimkolwiek innym edytorze) transformacja jest nadal dodawana. Dziwne.
uciekł kot

1
W jaki sposób dostosowałbyś C, gdybyś miał 2 ścieżki podrzędne, np. M 8,0 12,0 C 11,3 13,1 14,9 13,55 16,0 13,0 C 2,4 9,8 2,8 10,2 8,0 12,0 C 7,6 7,8 7,6 8,1 5,0 9,0 i M 3,0 5,0 C 2,4 5,5 3,3 6,4 5,0 7,0 Które chcesz przekształcić się w jedną ścieżkę?
Konfiguracja

@Anton użyj przycisku zadaj pytanie , jeśli masz pytanie, na które nie ma odpowiedzi. Trudno jest zadawać pytania i odpowiadać w komentarzach, ponieważ dostępne jest bardzo ograniczone formatowanie.
Robert Longson,

2
@RobertLongson, dobrze to opisałeś. Chciałbym tylko, żebyś rozwinął: „Gdyby któreś były bezwzględne (wielkie litery), np. M lub C, również musiałyby zostać dostosowane”.
Konfiguracja

6
  1. Wybierz odpowiednie elementy
  2. Obiekt> Rozgrupuj (powtarzaj, aż wszystko zostanie rozgrupowane; patrz edytor XML dla zagnieżdżonych węzłów)
  3. Ścieżka> Obiekt do ścieżki (konwertuje wielokąty na ścieżki)
  4. Obiekt> Przekształć> Odznacz względne przesunięcie> Zastosuj

Wydaje się, że nie działa w Inkscape 0.91. Element <g>z transformatrybutem pozostaje taki, jaki był. Również mój obiekt (tak jak ten pokazany w pytaniu) jest już ścieżką.
LUB Mapper

Czy możesz wkleić link do swojego SVG?
Charlie

5

Aby usunąć atrybut transform z gelementu (grupy) w Inkscape, możesz przenieść grupę na jej ostateczne miejsce, rozgrupować ją, a następnie przegrupować wszystkie elementy. Teraz została utworzona nowa grupa i jeśli nie przeniesiesz jej ponownie, nie zostanie do niej dołączony atrybut transformacji.


4

Jeśli ktoś wyląduje tutaj, szukając rozwiązania, aby to zrobić w Szkicu 3, wybierz warstwę, a następnie kliknij Warstwa-> Ścieżki-> Spłaszcz.


3

Znalazłem to:

  • Ustaw żądany rozmiar strony *
  • Jeśli twoja bieżąca warstwa ma transformację (sprawdź w edytorze XML, jest to górna grupa pod elementem SVG), utwórz nową warstwę i przenieś do niej wszystkie obiekty
  • Rozgrupuj wszystkie grupy (może to nie być potrzebne, YMMV)
  • Zaznacz wszystkie obiekty i zastosuj transformację zerową (taką jak skalowanie o 100% 100% lub strzałka w prawo + strzałka w lewo), mając transformację Sklepu: Zoptymalizowane w Preferencjach / Transformacjach
  • Jeśli musiałeś cofnąć jakiekolwiek grupy, możesz je teraz przegrupować
  • Zapisz kopię jako zoptymalizowany SVG i ustaw żądaną dokładność liczbową

*: Lub przynajmniej umieść obiekty tam, gdzie ich potrzebujesz, w stosunku do lewego górnego rogu strony. Szkoda, że ​​współrzędne SVG odnoszą się do lewego górnego rogu, podczas gdy Inkscape zmienia rozmiar strony względem lewego dolnego rogu!


Potrzebowałem sztuczki „przenieś na inną warstwę”, ponieważ transformacja, którą chciałem przesunąć, znajdowała się na <g> warstwy. Układ współrzędnych Inkscape jest dość denerwujący.
Mutant Bob

3

Udało mi się pozbyć matrix(...)transformacji (z powodu dublowania), łącząc ścieżkę z prostokątem, a następnie usuwając węzły prostokąta. translate(...)Część mieszkaliśmy choć.


To jedyne rozwiązanie jakie znalazłem. Połącz z nową czystą ścieżką, a następnie usuń niepotrzebną część.
Márton Tamás

2

W moim przypadku zapisanie jako zoptymalizowany SVG rozwiązało problem. Więc w Inkscape użyj:

Plik -> Zapisz jako ... -> Zoptymalizowany SVG.


Jaki był twój problem przy okazji? Przyszedłem tutaj po wypróbowaniu wszystkiego. Ale problem nadal występuje.
Sahu V Kumar

@VishalKumarSahu Nie mogę zaimportować ikony aplikacji na Androida (SVG) jako zasobu, ponieważ transformatrybut nie jest obsługiwany przez Android Studio.
Michał Stochmal

Tak, to samo dotyczy również internetu. Transformacja stwarza problem w wynikach, ale jest bardzo pomocna podczas porządkowania obiektów jako grupy. Muszę wykonać obliczenia, aby rozwiązać cel.
Sahu V Kumar

2

Działa to, jeśli używasz Inkscape:

  1. Zaznacz wszystko i rozgrupuj
  2. Zapisz jako „Optimized Svg (* .svg)”

We wszystkich przypadkach, które próbowałem, usunęło to wszelkie atrybuty transformacji. Nie jestem pewien, czy zadziała w przypadku bardziej złożonych plików SVG.


1

Wypróbowałem rozwiązanie zamieszczone tutaj, a mianowicie usunięcie tagów grup w pliku SVG i ponowne otwarcie go w Inkscape (w moim przypadku 0.48.3.1). Niestety, po ponownym przetłumaczeniu ścieżek za pomocą trybu zaznaczania i transformacji (F1) i zapisaniu go, znaczniki grupowe pojawiły się ponownie! Inkscape zapisuje wszystkie transformacje zastosowane do ścieżki w otaczającym elemencie grupy. Jeśli nie używasz narzędzia wyboru ścieżki-węzła (F2), naciśnij ctrl + a i przesuń węzły ścieżki we właściwe miejsce. Po tym, jak to zrobiłem, a potem zapisałem, Inkscape nie dodał tagów grup, ponieważ to tłumaczenie zostało zastosowane bezpośrednio do modelu ścieżki. Mam nadzieję że to pomoże.


1

W moim przypadku grupy są faktycznie tworzone przez warstwy. Usunięcie wszystkich warstw w dokumencie spowodowało usunięcie grupy i transformacji (prawdopodobnie w połączeniu z rozgrupowaniem obiektów i przegrupowaniem ich itp., Jak w przypadku usuwania przekształceń w plikach SVG (odpowiedź-35490189 z @Charlie powyżej))


0

Mój specyficzny problem dotyczył symboli, które zostały zdefiniowane poza stroną, co wymagało pokazania transformacji na stronie.

Aby przenieść symbole na stronę bez konieczności przekształcania, musiałem wykonać następujące kroki w Inkscape:

  1. Otwórz okno symboli (Shift + Ctrl + Y)
  2. Usuń symbol z biblioteki dokumentów. (W oknie jest do tego przycisk).
  3. Teraz grafika pojawia się w dokumencie poza granicami strony.
  4. Rozgrupuj grafikę. (To ważny krok!)
  5. Przesuń grafikę wewnątrz granicy strony.
  6. Dodaj grafikę z powrotem do biblioteki symboli.

0

Wydaje się to przypadkowe, ale nic innego, co próbowałem, nie działało, więc tutaj idziesz przypadkową inną osobą. Niektóre z moich ścieżek miały wokół siebie margines, który można było zobaczyć tylko po ich wybraniu ( przykład). Myślę, że zostało to utworzone, gdy wkleiłem warstwę z innego pliku inkscape i obróciłem ją o 90 stopni. To spowodowało, że wypełnienie deseniem na kształtach miało inną transformację (linie oddalone od siebie). Sprawiało również, że wyrównywanie obiektów nie działało zgodnie z oczekiwaniami. Użycie opcji Zastosuj transformację, o której wspomniał @Piotr_cz, naprawiło problem z transformacją, ale dziwny margines pozostał. Przypadkowo się go pozbyłem, zmieniając Blur on Stroke na dowolną wartość i zmieniając go z powrotem na zero.


0

Jakoś nie miałem szczęścia w żadnym z podejść. Jeśli <defs>w twoim svg jest sekcja i używa się w ten sposób:

<g transform="matrix( *** ) "><use xlink:href="#***"/></g>

może być konieczne usunięcie wszystkich zastosowań i usunięcie wszystkiego z sekcji defs. Następnie możesz użyć inkscape, aby umieścić to wszystko we właściwy sposób, a następnie zastosować transformacje za pomocą wspomnianej wtyczki. Mam nadzieję, że to komuś pomoże.


0

Mam ten problem od lat. Rozwiązaniem jest oczywiście możliwość dynamicznej zabawy z transformacjami w przeglądarce, jeśli nie będzie to „naprawiane” w inkscape.

Użytkownik Mc na forach Inkscape dał mi to rozwiązanie .

Rozwiązanie buduje bieżącą transformację między elementem SVG a jego elementem głównym SVG, a następnie zwraca pełny zestaw informacji BBox na podstawie wszystkich przekształceń.

Byłaby również możliwa łatwa zmiana elementu, do którego odnoszą się obliczenia, gdybyś chciał wykonać w przeglądarce pracę między dwiema częściami tego samego pliku SVG.

Wreszcie mogę mieć panoramiczny widok SVG.


0

Inkscape 1.0 na Kubuntu 20.04

Chociaż ten wątek jest dość stary, chciałbym zamieścić moje doświadczenia / rozwiązanie. Natknąłem się na ten problem, próbując utworzyć szablon dla środowiska roboczego FreeCAD TechDrawing. Te szablony nie mogą zawierać żadnych przekształceń.

W moim przypadku musiałem dodać logo firmy z zewnętrznego pliku .svg (w całości wykonanego w Inkscape). Logo zawiera elementy graficzne i tekstowe. Podczas kopiowania tego logo do szablonu utworzono transformacje, które spowodowały, że szablon nie działał poprawnie we FreeCAD.

  • Po pierwsze, to rozwiązanie sugerowane na www.freecadweb.org / ... nie działa dla mnie. Dlatego przeszukałem sieć i znalazłem tę dyskusję.

  • Po drugie, żadne z zaproponowanych powyżej rozwiązań nie zadziałało, ale postawiły mnie na właściwej drodze. Odpowiedź Charliego była bliska, ale Obiekt> Przekształć> Odznacz ruch względny> Zastosuj nie wykazał żadnej różnicy.

U mnie zadziałało:

  1. Jak wspominali inni, rozgrupuj wszystko.
  2. Konwertuj obiekty tekstowe na ścieżki - w moim przypadku wydawało się to być niezbędne!
  3. Usuń wszystkie istniejące transformacje w edytorze xml i obserwuj, co się dzieje z powiązanymi obiektami. W moim przypadku odpowiednie elementy zmieniły swoje położenie.
  4. Popraw te zmiany ręcznie, ale niczego nie grupuj.
  5. Zapisz jako zwykły plik svg (normalny = bez optymalizacji lub innych specjalnych ustawień)

Działa dobrze, gdy używam tego szablonu we FreeCAD.


Jeden dziwny szczegół: chociaż moje rozwiązanie sugeruje, że w moim przypadku problemem były elementy tekstowe, to nie może być takie proste. W rzeczywistości dokument bazowy (ten, do którego skopiowałem logo) zawiera wiele elementów tekstowych i żadnego z nich nie przekonwertowałem. Więc może to być połączenie „źródła zewnętrznego” i elementów tekstowych. Po prostu zamieszczam ten szczegół jako wskazówkę dla innych, którzy mogą mieć podobne problemy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.