Tengo un SVG con una gran cantidad de texto. Es un mapa de aparcamiento con números de espacio escritos en él. Muestro esto en un navegador web y, gracias a un pequeño error maravilloso en Firefox , el navegador muestra el texto incorrectamente. Abucheo.
Entonces convertí el texto a caminos. Estamos hablando de hasta 4000 etiquetas separadas. Tal vez 15,000 nuevas formas ahora son vectores. Son 4MB. Normalmente podría argumentar que esto se prestaría a la compresión, pero tengo que alinear este SVG en el HTML . Estoy agregando alteraciones CSS de forma dinámica y esta es la única forma en que tengo la posibilidad de compatibilidad con navegadores cruzados. De todos modos, la salida cruda —incluso fregada— de esto es demasiado grande para ser útil.
Lo que me sorprende aquí es que todos estos números espaciales comparten glifos comunes. De cero a nueve. ¿Por qué incluyo una definición de forma para cada instancia de cada número? ¿Puedo desduplicar estos?
Estoy usando Inkscape pero estoy abierto a sugerencias.
path|simplify
ayudarlo? Una "s" en minúscula se convierte en una ruta de 28 puntos, simplifica la srops a 17, y superpone las versiones simplificadas y no simplificadas incluso con zoom para que una "s" llene la pantalla no hay diferencia.Respuestas:
El
<use>
elemento le permite reutilizar objetos definidos en otra parte del documento. Por ejemplo, podría definir cada glifo como a<symbol>
y luego reutilizarlos varias veces. He aquí un buen artículo al respecto: Estructuración, agrupamiento y hacer referencia en SVG - La<g>
,<use>
,<defs>
y<symbol>
Elementos .Sin embargo, no sé cómo hacerlo directamente en Inkscape, especialmente no para un montón de texto que ya tienes como texto. Puede que tenga que escribir un script para procesar posteriormente el SVG y encontrar todas las rutas que se pueden reutilizar.
fuente
<use>
era lo que estaba pensando cuando le pregunté esto, las secuencias de comandos es el cómo. Parece tonto que no haya nada ahí fuera para duplicar el marcado casi idéntico.<symbol>
s (o parece que podría tener<def>
sus glifos de texto a rutaHay algunas opciones de compresión disponibles que ofrecerán diversos grados de éxito. Para probarlos, creé un archivo de arte que solo tenía mucho texto repetido. Sin expandir, el tamaño del archivo es 13.8 KB. Ampliado, el tamaño del archivo es 1,42 MB .
Buena opción: usar SVGZ - 46.5 KB
Guardar la ilustración ampliada como SVGZ me dio un archivo de salida de 46,5 KB, que es significativamente más pequeño que el SVG estándar. Tenga en cuenta que el soporte puede variar .
Mejor opción: comprimir con Scour - 21.1 KB
Scour es una herramienta que eliminará y optimizará su archivo SVG por usted. Usando el comando de "compresión máxima"
scour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping --enable-comment-stripping --shorten-ids --indent=none
, la ilustración ampliada se redujo a 21,1 KB. ¡No muy lejos del tamaño original del archivo sin expandir!fuente
scour
no se comprime. Puede también lanzar el archivo a través de gzip para usted, pero el ID y el espacio en blanco cosas minimización es su principal concierto.Esta es una solución en el navegador o en el servidor
Hay muchas formas diferentes de optimizar los archivos SVG. Parece que ya lo has hecho bastante.
Algunos recursos que he encontrado muy útiles son un artículo de css-tricks que se centra en detalles muy específicos. Y específicamente, la herramienta que usa SVGO .
Si tiene muchas rutas repetidas, consideraría usar javascript para crear las formas dinámicamente. Hay un ejemplo aquí . Una dirección sería tener una función definida para cada glifo, y simplemente tener cada ruta dentro del elemento svg creado por una solicitud para esa función. O tome una cadena completa, y / o una matriz de argumentos, para crear su svg en línea. Esto, por supuesto, espera que sus rutas sean más largas que la longitud del código requerido para solicitar dicha función (suposición bastante fácil).
fuente
<use xlink:href="#digit_one">
wheredigit_one
is a pathAquí en un nivel muy alto es lo que debe hacer su script. Siéntase libre de usar su idioma y entorno preferidos, este es solo un punto de partida para una lógica que debería darle lo que está buscando.
<defs>
sección apropiada que defina la información de ruta para cada dígito.<g>
espacios de estacionamiento y reemplácelos con un<use xlink:href="#digit" x=x y=y />
Puedo prever algunas complicaciones con las que tendrás que lidiar, y buena suerte con ellas.
Espero que esto ayude. Buena suerte.
fuente