Mam obraz, którego używam na stronie internetowej. Chciałbym użyć SVG, aby mógł mieć dowolny rozmiar i nadal wyglądać ostro.
- Ta skrzynka zawiera plik SVG, a także oryginalny plik programu Illustrator.
To jest eksport JPEG:
Plik SVG ma znacznie większy rozmiar pliku niż JPG. Czy można zoptymalizować plik SVG, aby miał podobny rozmiar pliku? Mogłabym stracić trochę jakości, jeśli to pomogłoby. Próbowałem tego optymalizatora SVG , ale nie miało to większego znaczenia.
Jeśli zapiszę plik ilustratora jako JPG, prześledź wynik i zapisz go jako SVG, a następnie otrzymam znacznie mniejszy rozmiar pliku, ale z pewną utratą jakości. To sprawia, że myślę, że może warstwy w oryginale powodują duży rozmiar? Czy obraz, nad którym pracuję, jest zbyt skomplikowany, aby nadawał się do SVG?
Odpowiedzi:
Plik SVG zawiera osadzoną pikselową grafikę dla odcienia w prawym dolnym rogu kontrolera. Jest to odpowiedzialne za około ⅔ rozmiaru pliku. Jeśli go usuniesz, plik SVG będzie równy plikowi JPEG. Prawdopodobnie można uzyskać odpowiednio podobny efekt za pomocą gradientu.
Inne techniki zmniejszania rozmiaru pliku SVG obejmują:
O ile nie używasz absurdalnie wielu warstw (pomyśl o jednej warstwie dla każdego obiektu), warstwy nie powinny mieć istotnego wpływu na rozmiar pliku, a nawet wtedy byłby to tylko ułamek.
Jeśli możesz rozsądnie utworzyć obraz od podstaw¹, nie powinno to być zbyt skomplikowane dla formatu SVG. Nie ma czegoś takiego, jak magiczny próg złożoności, powyżej którego eksplodują rozmiary plików (prawdopodobnie dotyczy to dowolnego rozsądnego formatu). Oczywiście, jeśli wybierzesz tylko wystarczająco grubą rozdzielczość, możesz wyeksportować każdy plik SVG do pliku JPEG o mniejszym rozmiarze pliku. Ale to niekoniecznie oznacza, że nie powinieneś używać SVG.
¹ Jest to w szczególności bez śledzenia i podobne. Podajmy skrajny przykład: jeśli chcesz dokładnie odtworzyć każdy piksel zdjęcia za pomocą prymitywów SVG (tj. Bez osadzania grafiki pikselowej w SVG), możesz rzeczywiście uznać wynik za zbyt skomplikowany, aby mógł być skutecznie reprezentowany w formacie SVG . Ale mam nadzieję, że to zdrowy rozsądek.
źródło
Jak już wskazał Wrzlprmft, ponad 50% rozmiaru pliku SVG jest zajmowane przez osadzony obraz bitmapowy PNG używany do tworzenia dość subtelnego efektu cieniowania na kontrolerze. Wystarczy pozbyć się tego obrazu i zastąpić go prostym gradientem promieniowym, aby zmniejszyć plik SVG do około 10 kb.
Oryginalny obraz z fantazyjnym cieniowaniem bitmapy po lewej, edytowana wersja z prostym gradientem radialnym po prawej stronie.
W tym miejscu powinieneś również sprawdzić swoje ścieżki, aby sprawdzić, czy jest coś, co można by uprościć. Nie znalazłem wiele, ale kontur twojego kontrolera ma kilka sąsiednich węzłów (w pobliżu górnego i dolnego środkowego środka), które można połączyć bez widocznej różnicy.
To łatwe 50% oszczędności, ale nie przestawajmy jeszcze. Jeśli wiesz choć trochę o formacie SVG , możesz zrobić o wiele więcej.
Najpierw uruchom „Defrags próżni” w Inkscape, aby pozbyć się niepotrzebnych definicji, a następnie zapisz obraz jako „zwykły plik SVG”. Teraz nadszedł czas, aby otworzyć go w edytorze tekstu i zobaczyć, czego możemy się pozbyć. Najlepiej jest użyć edytora ze zintegrowanym podglądem SVG, aby szybko zobaczyć, jaki wpływ (mam nadzieję, że nie ma) na modyfikację wyglądu obrazu. Używam do tego emacsa , ale istnieją inne edytory z podobnymi funkcjami .
W każdym razie, gdy plik SVG jest otwarty w edytorze tekstu, zacznijmy go upraszczać!
Na samej górze jest duży bezużyteczny
<!-- comment -->
. Po prostu go usuń.Jeśli edytujesz plik SVG bezpośrednio z programu Illustrator, istnieje również niepotrzebna
<!DOCTYPE ... >
linia. Usuń też.Inkscape nalega na naklejenie niepotrzebnego bloku metadanych RDF na obrazie. Wystarczy zlokalizować
<metadata ...>
tag i usunąć go, wraz ze wszystkim do zamknięcia włącznie</metadata>
.Ponadto, nawet jeśli zapiszesz plik jako „zwykły plik SVG”, Inkscape nadal zaśmieca go szeregiem niestandardowych atrybutów. Znajdź każdy atrybut, który zaczyna się od
inkscape:
lubsodipodi:
i usuń je.Po usunięciu metadanych i atrybutów specyficznych dla Inkscape możesz usunąć wszystkie nieużywane atrybuty przestrzeni nazw XML ze
<svg>
znacznika. Powinien on być usunięcie co najmniej bezpiecznyxmlns:rdf
,xmlns:dc
,xmlns:cc
,xmlns:inkscape
ixmlns:sodipodi
. Jeśli istnieje nadmiarowyxmlns:svg
atrybut, usuń go również. Jedynymi atrybutami przestrzeni nazw, które powinieneś pozostawić w tym momencie, są:<svg>
Tag ma również kilka innych bezużytecznych atrybutów można bezpiecznie usunąć, jakenable-background
ixml:space="preserve"
. (Ci, wprowadzane są przez eksportera Illustrator SVG, Inkscape i nie jest wystarczająco inteligentny, aby zdać sobie sprawę, że są bezużyteczne.) JakviewBox
atrybut może być bezpiecznie usunięty z tego obrazu, ponieważ po prostu powtarza wartościamix
,y
,width
iheight
atrybutów.Możesz także bezpiecznie usunąć atrybuty
encoding
istandalone
z<?xml ... ?>
tagu.Przejdźmy teraz do wnętrzności danych obrazu. Z jakiegoś powodu Inkscape nalega na przypisanie
id
atrybutów do każdego elementu, nawet jeśli nigdy nie ma do nich odwołania. Każdyid
atrybut, którego wartość nigdy nie jest powtarzana w innym miejscu pliku (wyszukaj go!) Można bezpiecznie usunąć. Zasadniczo jedyne identyfikatory, które należy zachować, to identyfikatory gradientów i ewentualnie innych obiektów (np. Ścieżek) znalezionych w<defs>
sekcjach.Ponadto Inkscape lubi generować długie identyfikatory takie jak
linearGradient4277
. Zastanów się nad skróceniem identyfikatorów, których nie możesz po prostu usunąć, do czegoś takiego jak skrótlg1
.Istnieje również wiele
<defs>
sekcji bezpośrednio po sobie. Połączenie ich oszczędza kilka bajtów (i ogólnie upraszcza strukturę dokumentu).Na
<g>
końcu pliku znajduje się także kilka pustych grup ( elementów). Po prostu się ich pozbądź. Może również istnieć wiele kolejnych grup z dokładnie tym samymtransform
atrybutem (lub wcale); można również bezpiecznie je połączyć.Z jakiegoś dziwnego powodu Inkscape zapisuje nadmiarową ścieżkę Beziera (
d
atrybut) dla<circle>
elementów. To zajmuje miejsce bez absolutnie żadnego powodu, więc po prostu je usuń. (Pozostawd
atrybuty na<path>
elementach; są one faktycznie używane do czegoś.)Inkscape lubi również używać CSS w
style
atrybutach, w których bardziej szczegółowe atrybuty byłyby krótsze, np. Przepisywaniefill="#4888fa"
do bardziej szczegółowychstyle="fill:#4888fa"
. Możesz zaoszczędzić kilka bajtów, dzieląc te style na poszczególne atrybuty (i usuwając te, które po prostu bezużytecznie powtarzają ustawienie domyślne), ale wymagają nieco większej znajomości formatu SVG niż większość powyższych zmian.Ponadto, jeśli są jakieś
<use ... >
elementy, możesz być w stanie zaoszczędzić kilka bajtów, zastępując je rzeczywistym elementem, z którym się łączą. (Oczywiście oszczędza to miejsce tylko wtedy, gdy połączone elementy są używane tylko raz.) Wydaje się również, że Inkscape lubi pośrednio definiować gradienty kołowe, najpierw definiując punkty zatrzymania w a<linearGradient>
, a następnie odwołując się do nich w<radialGradient>
; możesz to uprościć, przesuwając ograniczniki bezpośrednio wewnątrz gradientu promieniowego i pozbywając się nieużywanego gradientu liniowego. Jako bonus, jeśli w ten sposób udało ci się pozbyć wszystkichxlink:href
atrybutów, możesz usunąćxmlns:xlink
atrybut z<svg>
tagu.Jeśli naprawdę chcesz wycisnąć każdy dodatkowy bajt, poszukaj wartości liczbowych ze zbyt dużą liczbą miejsc po przecinku i zaokrąglij je do czegoś bardziej sensownego. Tutaj naprawdę pomaga podgląd na żywo, ponieważ pozwala zobaczyć, jak można zaokrąglić wartość, zanim zacznie być widoczna. Nawet jeśli nie chcesz dokładnie testować każdej liczby, aby zobaczyć, ile można zaokrąglić, możesz przynajmniej wybrać nisko wiszące owoce, na przykład zaokrąglając wartość
1.0000859
pikseli do tylko1
.Na koniec wyczyść wcięcia i białe znaki w pliku. Aby całkowicie zminimalizować liczbę bajtów, musisz umieścić wszystko w jednym wierszu (lub przynajmniej wstawiać podziały wiersza przed atrybutami, gdzie i tak wymagana jest biała spacja), ale to naprawdę trudne do odczytania. Mimo to możliwe jest zachowanie odpowiedniej równowagi między czytelnością a kompaktowością za pomocą prostego, konserwatywnego wcięcia.
W każdym razie oto, czym udało mi się ręcznie edytować twój obraz SVG w:
Ten obraz SVG wygląda prawie nie do odróżnienia od drugiego przykładowego obrazu powyżej i zajmuje tylko 5189 bajtów, czyli znacznie mniej niż obraz JPEG. Jestem pewien, że można go jeszcze zoptymalizować, ale tak naprawdę to tylko przykład tego, co możesz zrobić w ciągu kilku minut dzięki ćwiczeniom. ( Napisanie tej odpowiedzi zajęło mi dużo więcej czasu niż faktyczna edycja kodu SVG).
Wreszcie, skompresowanie tego kodu SVG za pomocą gzip zmniejsza go do zaledwie 1846 bajtów (!), Niewiele ponad ćwierć wielkości twojej wersji JPEG.
źródło
Jestem trochę zaskoczony, że nikt nie wspomniał o rozszerzeniu „ Scour ”. Jest dołączony do Inkscape (od wersji 0.47) i wykonuje wiele optymalizacji wspomnianych przez Ilmari Karonen.
źródło
Możesz przekonwertować go na skompresowany plik SVG (SVGZ) i umieścić plik image.svgz na swojej stronie internetowej:
Lub, w Adobe Illustrator, po prostu zapisz jako „skompresowany SVG”, który napisze plik image.svgz.
W przypadku obrazu testowego jest on jednak większy niż plik JPG:
źródło
Niedawno znalazłem narzędzie na https://petercollingridge.appspot.com/svg-editor ( kod źródłowy ), które pomaga zoptymalizować pliki SVG. W tym przypadku ma dobre wyniki, zmniejszając rozmiar pliku do 3,7 kB, czyli nieco ponad połowę wielkości pliku JPG, z niewielką ręczną regulacją:
Korzystanie z tego narzędzia do optymalizacji plików SVG wymaga znacznie mniej czasu niż ręczne golfowanie pliku.
źródło
SVGOMG! to niesamowita aplikacja internetowa do optymalizacji SVG
Według twórcy aplikacji, SVGOMG jest SVGO „s " M Issing G UI".
Uruchomienie go na dostarczonym obrazie sprowadza go do samego
3.42kb
i zaraz1.4kb
po zgzipowaniu.źródło
<radialGradient>
i<path>
z mojego kodu zoptymalizowanego ręcznie, SVGOMG optymalizuje wynikowy obraz 5,8 kB do 4,02 kB (4.11 kB prettified) i wydaje się, że wykonuje dość dokładną robotę; Naprawdę nie widzę żadnych oczywistych straconych okazji. (Grając trochę bardziej, zauważyłem, że czasami nie łączy kolejnych grup o identycznych atrybutach; Inkscape czasami wydaje się je generować, np. Podczas dostosowywania strony do rysunku.)