Eu tenho um SVG com uma carga de texto nele. É um mapa de estacionamento com números de espaço escritos. Eu exibo isso em um navegador da Web e, graças a um maravilhoso bug no Firefox , o navegador renderiza o texto incorretamente. Vaia.
Então eu converti o texto em caminhos. Estamos falando de até 4000 rótulos separados. Talvez 15.000 novas formas agora sejam vetores. São 4MB. Normalmente você pode argumentar que isso se presta à compactação, mas eu tenho que alinhar esse SVG no HTML . Estou adicionando alterações de CSS dinamicamente e essa é a única maneira de ter suporte para vários navegadores. De qualquer maneira, a produção bruta - mesmo vasculhada - disso é muito grande para ser útil.
O que me impressiona aqui é que todos esses números de espaço compartilham glifos comuns. Zero a nove. Por que estou incluindo uma definição de forma para cada instância de cada número? Posso desduplicar estes?
Estou usando o Inkscape, mas estou aberto a sugestões.
path|simplify
ajudá-lo? Um "s" minúsculo se converte em um caminho de 28 pontos, simplifica o aumento para 17 e, sobrepondo as versões simplificadas e não simplificadas até com zoom, para que um "s" preencha a tela, não há diferença.Respostas:
O
<use>
elemento permite reutilizar objetos definidos em outras partes do documento. Por exemplo, você pode definir cada glifo como a<symbol>
e reutilizá-los várias vezes. Aqui está um artigo agradável sobre ele: Estruturação, Agrupamento, e referenciando em SVG - A<g>
,<use>
,<defs>
e<symbol>
Elements .Porém, não sei como fazer isso diretamente no Inkscape - especialmente para um monte de texto que você já possui como texto. Pode ser necessário escrever um script para pós-processar o SVG e encontrar todos os caminhos que podem ser reutilizados.
fonte
<use>
era o que eu estava pensando quando eu perguntei isso, o script é o como. Parece bobagem que não haja nada lá para duplicar marcações quase idênticas.<symbol>
s (ou parece que você poderia<def>
seus glifos de texto-para-pathExistem algumas opções de compactação disponíveis que oferecem graus variados de sucesso. Para testá-los, criei um arquivo de arte que tinha apenas muito texto repetido. Sem expansão, o tamanho do arquivo é 13,8 KB. Expandido, o tamanho do arquivo é 1,42 MB .
Boa opção: Use SVGZ - 46,5 KB
Salvar o trabalho artístico expandido como SVGZ me deu um arquivo de saída de 46,5 KB, que é significativamente menor que o SVG padrão. Observe que esse suporte pode variar .
Melhor opção: Comprima com Scour - 21.1 KB
O Scour é uma ferramenta que limpa e otimiza seu arquivo SVG para você. Usando o comando "compressão máxima" de
scour -i input.svg -o output.svgz --enable-viewboxing --enable-id-stripping --enable-comment-stripping --shorten-ids --indent=none
, o trabalho artístico expandido foi reduzido para 21,1 KB. Não muito longe do tamanho original do arquivo não expandido!fonte
scour
não se comprime. Ele também pode enviar o arquivo através do gzip para você, mas o material de minificação de ID e espaço em branco é o seu show principal.Esta é uma solução no navegador ou no servidor
Existem muitas maneiras diferentes de otimizar arquivos SVG. Parece que você já fez um pouco disso.
Alguns recursos que eu achei muito úteis são um artigo de CSS-Tricks que se concentra em detalhes muito específicos. E, especificamente, a ferramenta que usa SVGO .
Se você tiver muitos caminhos repetidos, consideraria usar o javascript para criar as formas dinamicamente. Há um exemplo aqui . Uma direção seria ter uma função definida para cada glifo e simplesmente ter cada caminho dentro do elemento svg criado por uma solicitação para essa função. Ou pegue uma string completa e / ou array de argumentos para criar seu svg embutido. Obviamente, isso espera que seus caminhos sejam maiores que o comprimento do código necessário para solicitar a referida função (suposição bastante fácil).
fonte
<use xlink:href="#digit_one">
em quedigit_one
é um caminhoAqui, em um nível muito alto, está o que seu script deve fazer. Sinta-se livre para usar seu idioma e ambiente preferidos, este é apenas um ponto de partida para uma lógica que deve fornecer o que você está procurando.
<defs>
seção apropriada que define as informações do caminho para cada dígito.<g>
pontos de estacionamento e substitua-os por um<use xlink:href="#digit" x=x y=y />
Eu posso prever algumas complicações com as quais você terá que lidar e boa sorte com elas.
Espero que isto ajude. Boa sorte.
fonte