Ich habe eine SVG mit einer Menge Text darauf. Es ist ein Parkplatzplan mit Platznummern darauf geschrieben. Ich zeige dies in einem Webbrowser an und dank eines wunderbaren kleinen Fehlers in Firefox gibt der Browser den Text falsch wieder. Buh.
Also habe ich den Text in Pfade umgewandelt. Wir sprechen von bis zu 4000 separaten Labels. Vielleicht 15.000 neue Formen, jetzt sind sie Vektoren. Es sind 4 MB. Normalerweise könnten Sie argumentieren, dass sich dies für eine Komprimierung eignen würde, aber ich muss dieses SVG in das HTML einfügen . Ich füge CSS-Änderungen dynamisch hinzu, und nur so habe ich eine Chance auf browserübergreifende Unterstützung. Jedenfalls ist die rohe – sogar bereinigte – Ausgabe davon 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 für jede Instanz jeder Zahl eine Formdefinition hinzu? Kann ich diese deduplizieren?
Ich verwende Inkscape, bin aber offen für Vorschläge.
Mit dem <use>
Element können Sie an anderer Stelle im Dokument definierte Objekte wiederverwenden. Beispielsweise könnten Sie jede Glyphe als definieren <symbol>
und sie dann mehrmals wiederverwenden. Hier ist ein netter Artikel darüber: Structuring, Grouping, and Referencing in SVG — The <g>
, <use>
, <defs>
und <symbol>
Elements .
Ich weiß jedoch nicht, wie ich das direkt in Inkscape machen soll - besonders nicht für eine Menge Text, den Sie bereits als Text haben. Möglicherweise müssen Sie ein Skript schreiben, um das SVG nachzubearbeiten und alle Pfade zu finden, die wiederverwendet werden können.
<use>
war, was ich dachte, als ich das fragte, das Scripting ist das Wie. Scheint albern, dass es nichts gibt, um nahezu identisches Markup zu deduplizieren.<symbol>
s ersetzen (oder es sieht so aus, als könnten Sie <def>
Ihre Text-zu-Pfad-GlyphenEs stehen einige Komprimierungsoptionen zur Verfügung, die unterschiedlich erfolgreich sind. Um sie zu testen, habe ich eine Grafikdatei erstellt, die nur viel wiederholten Text enthielt. Unerweitert beträgt die Dateigröße 13,8 KB. Erweitert beträgt die Dateigröße 1,42 MB .
Das Speichern des erweiterten Bildmaterials als SVGZ ergab eine Ausgabedatei von 46,5 KB, die deutlich kleiner als die Standard-SVG ist. Beachten Sie jedoch, dass die Unterstützung variieren kann .
Scour ist ein Tool, das Ihre SVG-Datei für Sie säubert 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 entfernt von der ursprünglichen nicht erweiterten Dateigröße!
scour
nicht komprimiert. Es kann die Datei auch für Sie durch gzip werfen, aber das ID- und Whitespace-Minification-Zeug ist seine Hauptaufgabe.Dies ist eine In-Browser- oder Server-Lösung
Es gibt viele verschiedene Möglichkeiten, SVG-Dateien zu optimieren. Klingt, als hättest du schon einiges geschafft.
Ein paar Quellen, die ich sehr nützlich fand, sind ein CSS-Tricks-Artikel , der sich auf sehr spezifische Details konzentriert. Und insbesondere das verwendete Tool SVGO .
Wenn Sie viele, sich wiederholende Pfade haben, würde ich in Betracht ziehen, Javascript zu verwenden, um die Formen dynamisch zu erstellen. Hier ist ein Beispiel . 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 erstellen. Oder nehmen Sie einen vollständigen String und/oder ein Array von Argumenten, um Ihr Inline-Svg zu erstellen. Dies setzt natürlich voraus, dass Ihre Pfade länger sind als die Länge des Codes, der zum Anfordern dieser Funktion erforderlich ist (ziemlich einfache Annahme).
<use xlink:href="#digit_one">
wo digit_one
ein Pfad istHier ist auf sehr hohem 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 geben sollte, wonach Sie suchen.
<defs>
Abschnitt an die SVG-Datei an, der die Pfadinformationen für jede Ziffer definiert.<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 dabei.
Hoffe das hilft. Viel Glück.
JohnB
Brichins
Oli
Robert Longson
Chris H
path|simplify
Ihnen das überhaupt helfen? Ein kleines „s“ wird in einen 28-Punkte-Pfad konvertiert, vereinfacht es auf 17, und das Überlagern der vereinfachten und nicht vereinfachten Versionen wird sogar gezoomt, sodass ein „s“ den Bildschirm ausfüllt, es gibt keinen Unterschied.Chris H
Chris H
Chris H
text-style
und einid
passendes Textelement haben, das Sie zuvor hatten, aber keinen tatsächlichen Text, um festzustellen, ob diese von den von Ihnen verwendeten Tools optimiert wurden (dh ob die Tools die Gruppen leer)