J'ai un SVG avec beaucoup de texte dessus. C'est une carte de parking avec des numéros d'espace écrits dessus. J'afficher dans un navigateur Web et grâce à un merveilleux petit bug dans Firefox , le navigateur affiche le texte de manière incorrecte. Huer.
J'ai donc converti le texte en chemins. Nous parlons jusqu'à 4000 étiquettes distinctes. Peut-être que 15 000 nouvelles formes sont maintenant des vecteurs. C'est 4 Mo. Normalement, vous pourriez affirmer que cela se prêterait à la compression, mais je dois intégrer ce SVG dans le code HTML . J'ajoute des modifications CSS dynamiquement et c'est la seule façon d'avoir une prise en charge multi-navigateurs. Donc, de toute façon, la sortie brute - même récurée - de ceci est trop grande pour être utile.
Ce qui me frappe ici, c'est que tous ces numéros d'espace partagent des glyphes communs. De zéro à neuf. Pourquoi est-ce que j'inclus une définition de forme pour chaque instance de chaque nombre? Puis-je les dédoublonner?
J'utilise Inkscape mais je suis ouvert aux suggestions.
path|simplify
vous vous aider du tout? Un "s" en minuscule se convertit en un chemin de 28 points, le simplifie à 17, et en superposant les versions simplifiées et non simplifiées, même zoomé pour qu'un "s" remplisse l'écran, il n'y a aucune différence.Réponses:
L'
<use>
élément vous permet de réutiliser des objets définis ailleurs dans le document. Par exemple, vous pouvez définir chaque glyphe comme un<symbol>
, puis les réutiliser plusieurs fois. Voici un article agréable à ce sujet: Structuration, regroupement et en SVG Referencing - Le<g>
,<use>
,<defs>
et<symbol>
éléments .Je ne sais pas comment faire cela directement dans Inkscape, cependant - surtout pas pour un tas de texte que vous avez déjà comme texte. Vous devrez peut-être écrire un script pour post-traiter le SVG et trouver tous les chemins qui peuvent être réutilisés.
la source
<use>
ce que je pensais quand j'ai demandé cela, le script est le comment. Il semble stupide qu'il n'y ait rien pour dédoublonner un balisage presque identique.<symbol>
s (ou il semble que vous pourriez utiliser<def>
vos glyphes texte-cheminCertaines options de compression sont disponibles et offriront divers degrés de réussite. Pour les tester, j'ai créé un fichier d'illustration qui ne contenait que beaucoup de texte répété. Non développé, la taille du fichier est de 13,8 Ko. Élargi, la taille du fichier est de 1,42 MB .
Bonne option: utilisez SVGZ - 46,5 Ko
L'enregistrement de l'illustration développée au format SVGZ m'a donné un fichier de sortie de 46,5 Ko, ce qui est nettement plus petit que le SVG standard. Notez cependant que le support peut varier .
Meilleure option: compresser avec affouillement - 21,1 Ko
Scour est un outil qui nettoiera et optimisera votre fichier SVG pour vous. À l'aide de la commande "compression maximale" de
scour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping --enable-comment-stripping --shorten-ids --indent=none
, l'illustration développée a été réduite à 21,1 Ko. Pas loin de la taille de fichier non développée d'origine!la source
scour
ne se comprime pas. Il peut également lancer le fichier via gzip pour vous, mais l'ID et les éléments de minification des espaces blancs sont son principal rôle.Il s'agit d'une solution dans le navigateur ou sur le serveur
Il existe de nombreuses façons d'optimiser les fichiers SVG. On dirait que vous en avez déjà fait pas mal.
Quelques ressources que j'ai trouvées très utiles sont un article css-tricks qui se concentre sur des détails très spécifiques. Et plus précisément, l'outil qu'il utilise SVGO .
Si vous avez de nombreux chemins répétés, j'envisagerais d'utiliser javascript pour créer les formes dynamiquement. Il y a un exemple ici . Une direction serait d'avoir une fonction définie pour chaque glyphe, et d'avoir simplement chaque chemin dans l'élément svg créé par une demande pour cette fonction. Ou prenez une chaîne complète et / ou un tableau d'arguments pour créer votre svg en ligne. Ceci, bien sûr, s'attend à ce que vos chemins soient plus longs que la longueur du code requis pour demander ladite fonction (hypothèse assez facile).
la source
<use xlink:href="#digit_one">
oùdigit_one
est un cheminVoici à un très haut niveau ce que votre script doit faire. N'hésitez pas à utiliser votre langue et votre environnement préférés, ce n'est qu'un point de départ pour une logique qui devrait vous donner ce que vous recherchez.
<defs>
section appropriée définissant les informations de chemin pour chaque chiffre.<g>
places de stationnement et remplacez-les par un<use xlink:href="#digit" x=x y=y />
Je peux prévoir certaines complications auxquelles vous devrez faire face, et bonne chance avec celles-ci.
J'espère que cela t'aides. Bonne chance.
la source