Ich habe eine SVG mit einer Menge Text. Es ist eine Parkplatzkarte mit Platznummern. Ich zeige dies in einem Webbrowser an und dank eines wunderbaren kleinen Fehlers in Firefox gibt der Browser den Text falsch wieder. Boo.
Also habe ich den Text in Pfade umgewandelt. Wir sprechen von bis zu 4000 verschiedenen Etiketten. Vielleicht 15.000 neue Formen, jetzt sind sie Vektoren. Es ist 4 MB. Normalerweise könnte man behaupten, dass dies zu einer Komprimierung führen würde, aber ich muss diese SVG in den HTML-Code einbinden . Ich füge CSS-Änderungen dynamisch hinzu und nur so habe ich die Möglichkeit, browserübergreifende Unterstützung zu erhalten. Auf jeden Fall ist die rohe Ausgabe - auch wenn sie gereinigt wurde - zu groß, um nützlich zu sein.
Was mir hier auffällt, ist, dass all diese Leerzeichen gemeinsame Glyphen haben. Null bis neun. Warum füge ich eine Formdefinition für jede Instanz jeder Zahl hinzu? Kann ich diese duplizieren?
Ich benutze Inkscape, bin aber offen für Vorschläge.
path|simplify
Ihnen aber überhaupt helfen? Ein "s" in Kleinbuchstaben wird in einen Pfad mit 28 Punkten umgewandelt, vereinfacht auf 17 Punkte und überlagert die vereinfachten und nicht vereinfachten Versionen, die sogar gezoomt wurden, so dass ein "s" den Bildschirm ausfüllt, es gibt keinen Unterschied.Antworten:
Mit dem
<use>
Element können Sie an anderer Stelle im Dokument definierte Objekte wiederverwenden. Sie können beispielsweise jedes Symbol als definieren<symbol>
und es dann mehrmals wiederverwenden. Hier ist ein schöner Artikel über sie: Strukturierung, Gruppieren und Referenzierung in SVG - Die<g>
,<use>
,<defs>
und<symbol>
Elemente .Ich weiß allerdings nicht, wie ich das direkt in Inkscape machen soll - vor allem nicht für eine Menge Text, die Sie bereits als Text haben. Möglicherweise müssen Sie ein Skript schreiben, um die SVG nachzubearbeiten und alle Pfade zu finden, die wiederverwendet werden können.
quelle
<use>
war es, woran ich dachte, als ich danach fragte, das Skripting ist das Wie. Scheint albern, dass es da draußen nichts gibt, um nahezu identische Markups zu de-duplizieren.<symbol>
s (oder es sieht aus wie könnten Sie<def>
Ihren Text-to-Pfad GlyphenEs sind einige Komprimierungsoptionen verfügbar, die unterschiedliche Erfolgsgrade bieten. Um sie zu testen, habe ich eine Grafikdatei erstellt, die nur viele wiederholte Texte enthält. Ohne Erweiterung beträgt die Dateigröße 13,8 KB. Erweitert beträgt die Dateigröße 1,42 MB .
Gute Option: Verwenden Sie SVGZ - 46,5 KB
Durch das Speichern des erweiterten Bildmaterials als SVGZ erhielt ich eine Ausgabedatei von 46,5 KB, die erheblich kleiner ist als die Standard-SVG-Datei. Beachten Sie jedoch, dass die Unterstützung variieren kann .
Bessere Option: Mit Scour komprimieren - 21,1 KB
Scour ist ein Tool, das Ihre SVG-Datei für Sie bereinigt und optimiert. Mit dem Befehl "Maximale Komprimierung" von
scour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping --enable-comment-stripping --shorten-ids --indent=none
wurde das erweiterte Bildmaterial auf 21,1 KB reduziert. Nicht weit von der ursprünglichen, nicht erweiterten Dateigröße entfernt!quelle
scour
komprimiert nicht. Es kann auch die Datei durch gzip für Sie werfen aber die ID und Leerzeichen minification Zeug ist sein Haupt Gig.Dies ist eine In-Browser- oder On-Server-Lösung
Es gibt viele verschiedene Möglichkeiten, um SVG-Dateien zu optimieren. Klingt so, als hättest du schon einiges getan.
Ein paar Ressourcen, die ich als sehr nützlich empfunden habe, sind CSS-Tricks , die sich auf sehr spezifische Details konzentrieren. Und speziell das Tool, das SVGO verwendet .
Wenn Sie viele, wiederholte Pfade haben, würde ich in Betracht ziehen, Javascript zu verwenden, um die Formen dynamisch zu erstellen. Es ist ein Beispiel hier . Eine Richtung wäre, eine definierte Funktion für jede Glyphe zu haben und einfach jeden Pfad innerhalb des SVG-Elements durch eine Anfrage für diese Funktion zu erzeugen. Oder nehmen Sie eine vollständige Zeichenfolge und / oder ein Array von Argumenten, um Ihre Inline-Svg zu erstellen. Dies setzt natürlich voraus, dass Ihre Pfade länger sind als der Code, der zum Anfordern dieser Funktion erforderlich ist (ziemlich einfache Annahme).
quelle
<use xlink:href="#digit_one">
wheredigit_one
is a path"Hier ist auf einem sehr hohen Niveau, was Ihr Skript tun sollte. Fühlen Sie sich frei, Ihre bevorzugte Sprache und Umgebung zu verwenden. Dies ist nur ein Ausgangspunkt für eine Logik, die Ihnen das geben sollte, wonach Sie suchen.
<defs>
Abschnitt definiert , die Pfadinformationen für jede Ziffer.<g>
s der Parkplätze und ersetzen Sie sie durch a<use xlink:href="#digit" x=x y=y />
Ich kann einige Komplikationen vorhersehen, mit denen Sie fertig werden müssen, und viel Glück damit.
Hoffe das hilft. Viel Glück.
quelle