Eu tenho uma imagem que estou usando em um site. Gostaria de usar um SVG para que ele possa ter qualquer tamanho e ainda parecer nítido.
- Essa caixa de depósito contém o arquivo SVG e o arquivo original do Illustrator.
Esta é uma exportação JPEG:
O SVG tem um tamanho de arquivo muito maior que o JPG. É possível otimizar o SVG para que ele tenha um tamanho de arquivo semelhante? Talvez eu consiga perder parte da qualidade, se isso ajudar. Eu tentei este otimizador SVG , mas não fez muita diferença.
Se eu salvar o arquivo do illustrator como JPG, rastrear o resultado e salvá-lo como um SVG, obterá um tamanho de arquivo muito menor, mas com alguma perda de qualidade. Isso me faz pensar que talvez as camadas no original estejam causando o tamanho grande? A imagem com a qual estou trabalhando é muito complexa para ser adequada ao SVG?
Respostas:
Seu SVG contém um gráfico de pixels incorporado para a sombra no canto inferior direito do controlador. Isso é responsável por cerca de ⅔ do tamanho do arquivo. Se você removê-lo, seu arquivo SVG é parecido com o seu JPEG. Provavelmente, é possível obter um efeito adequadamente semelhante com um gradiente.
Outras técnicas para reduzir o tamanho do arquivo SVG incluem:
A menos que você esteja usando muitas camadas absurdamente (pense em uma camada para cada objeto), as camadas não devem dar uma contribuição relevante ao tamanho do arquivo e, mesmo assim, seria apenas uma fração.
Se você puder criar razoavelmente uma imagem do zero¹, ela não deve ser muito complexa para o formato SVG. Não existe um limite de complexidade mágica além do qual os tamanhos dos arquivos explodem (provavelmente isso vale para qualquer formato vagamente razoável). Obviamente, se você escolher apenas a resolução suficientemente grossa, poderá exportar todos os SVG para um JPEG com tamanho de arquivo menor. Mas isso não significa necessariamente que você não deve usar SVGs.
¹ Isso é especialmente sem rastreamento e similar. Para dar um exemplo extremo: se você deseja reproduzir exatamente todos os pixels de uma fotografia com primitivas SVG (ou seja, sem incorporar gráficos de pixels em SVG), considere o resultado muito complexo para ser representado com eficiência no formato SVG . Mas espero que seja senso comum.
fonte
Como o Wrzlprmft já apontou, mais de 50% do tamanho do seu arquivo SVG é ocupado por uma imagem de bitmap PNG incorporada usada para criar um efeito de sombreamento bastante sutil no controlador. Apenas se livrar dessa imagem e substituí-la por um simples gradiente radial é suficiente para reduzir o SVG para cerca de 10kb.
Imagem original com sombreamento de bitmap sofisticado à esquerda, versão editada com gradiente radial simples à direita.
Enquanto você está nisso, você também deve verificar seus caminhos para ver se há algo para simplificar lá. Não encontrei muita coisa, mas o contorno do seu controlador possui alguns nós adjacentes (próximo ao meio superior e inferior) que podem ser mesclados sem fazer nenhuma diferença visível.
Essa é uma economia fácil de 50%, mas não vamos parar ainda. Se você conhece um pouco do formato SVG , pode fazer muito melhor que isso.
Primeiro, execute "Vacuum Defs" no Inkscape para se livrar de definições inúteis e salve a imagem como "SVG simples". Agora, é hora de abri-lo em um editor de texto e ver do que podemos nos livrar. Idealmente, você deve usar um editor com uma visualização integrada do SVG, para poder ver rapidamente que efeito (espero que nenhum) suas edições tenham na aparência da imagem. Eu uso o emacs para isso, mas existem outros editores com recursos semelhantes por aí.
De qualquer forma, com o arquivo SVG aberto no seu editor de texto, vamos começar a simplificá-lo!
Bem no topo, há um grande inútil
<!-- comment -->
. Apenas apague.Se você estiver editando um SVG diretamente do Illustrator, também há uma
<!DOCTYPE ... >
linha inútil . Exclua-o também.O Inkscape insiste em inserir um bloco inútil de metadados RDF na sua imagem. Basta localizar a
<metadata ...>
tag e excluí-la, juntamente com tudo, inclusive o fechamento</metadata>
.Além disso, mesmo se você salvar o arquivo como "SVG simples", o Inkscape ainda o ilumina com vários atributos personalizados. Encontre todos os atributos que começam com
inkscape:
ousodipodi:
e exclua-os.Com os metadados e os atributos específicos do Inkscape, você pode remover todos os atributos de espaço para nome XML não utilizados da
<svg>
marca. Deve ser seguro para remover pelo menosxmlns:rdf
,xmlns:dc
,xmlns:cc
,xmlns:inkscape
exmlns:sodipodi
. Se houver umxmlns:svg
atributo redundante , remova-o também. Os únicos atributos de namespace que você deve ter neste momento são:A
<svg>
tag também possui vários outros atributos inúteis que você pode remover com segurança, comoenable-background
exml:space="preserve"
. (Aqueles são inseridos pelo exportador Illustrator SVG, e Inkscape não é inteligente o suficiente para perceber que eles são inúteis.) OviewBox
atributo também pode ser removido com segurança a partir desta imagem, uma vez que apenas repete os valores dasx
,y
,width
eheight
atributos.Você também pode remover com segurança os atributos
encoding
estandalone
da<?xml ... ?>
marca.Agora vamos ao que interessa os dados da imagem. Por alguma razão, o Inkscape insiste em atribuir
id
atributos a todos os elementos, mesmo que nunca sejam referenciados. Qualquerid
atributo cujo valor nunca seja repetido em outra parte do arquivo (procure-o!) É seguro para remover. Basicamente, os únicos IDs que você precisa manter são os dos gradientes e possivelmente de outros objetos (por exemplo, caminhos) encontrados nas<defs>
seções.Além disso, o Inkscape gosta de gerar IDs longos, como
linearGradient4277
. Considere abreviar qualquer ID que não possa ser excluído em algo curto, como emlg1
vez disso.Também há várias
<defs>
seções logo após a outra. A mesclagem deles economiza alguns bytes (e simplifica a estrutura do documento em geral).Existem também vários grupos vazios (
<g>
elementos) no final do arquivo. Apenas se livre deles. Também pode haver vários grupos consecutivos com exatamente o mesmotransform
atributo (ou nenhum); também é seguro mesclar esses.Por algum motivo estranho, o Inkscape salva um caminho redundante de Bezier (
d
atributo) para<circle>
elementos. Isso ocupa espaço sem absolutamente nenhuma razão, então exclua-os. (Deixe osd
atributos nos<path>
elementos be; esses são realmente usados para algo.)O Inkscape também gosta de usar CSS em
style
atributos em que atributos mais específicos seriam mais curtos, por exemplo, reescrevendofill="#4888fa"
para os mais detalhadosstyle="fill:#4888fa"
. Você pode salvar alguns bytes dividindo esses estilos em atributos individuais (e removendo os que apenas repetem inutilmente a configuração padrão), mas que exigem um pouco mais de familiaridade com o formato SVG do que a maioria das alterações acima.Além disso, se houver algum
<use ... >
elemento, você poderá salvar alguns bytes substituindo-os pelo elemento real ao qual estão vinculando. (Obviamente, isso só economiza espaço se os elementos vinculados forem usados apenas uma vez.) Parece também que o Inkscape gosta de definir gradientes circulares indiretamente, primeiro definindo as paradas em a<linearGradient>
e depois referenciando-as em a<radialGradient>
; você pode simplificar isso movendo as paradas diretamente para dentro do gradiente radial e se livrando do gradiente linear agora não utilizado. Como bônus, se, ao fazer isso, você se livrar de todos osxlink:href
atributos, poderá excluir oxmlns:xlink
atributo da<svg>
tag.Se você realmente deseja extrair cada último byte extra, procure valores numéricos com decimais demais e arredonde-os para algo mais sensato. É aqui que a visualização ao vivo realmente ajuda, pois permite ver quanto você pode arredondar o valor antes que ele comece a ficar visível. Mesmo que você não queira testar cuidadosamente cada número para ver quanto ele pode ser arredondado, no entanto, é possível escolher pelo menos frutas penduradas como, por exemplo, arredondar um valor de
1.0000859
pixels para apenas1
.Por fim, limpe o recuo e os espaços em branco no arquivo. Para minimizar absolutamente a contagem de bytes, você precisa colocar tudo em uma linha (ou pelo menos, colocar apenas quebras de linha na frente de atributos, onde é necessário espaço em branco de qualquer maneira), mas isso é realmente difícil de ler. Ainda assim, é possível encontrar um equilíbrio decente entre legibilidade e compacidade com algum recorte simples e conservador.
De qualquer forma, aqui está o que eu consegui editar manualmente sua imagem SVG:
Esta imagem SVG parece quase indistinguível da segunda imagem de exemplo acima e ocupa apenas 5189 bytes, consideravelmente menos que a sua imagem JPEG. Tenho certeza de que poderia ser otimizado ainda mais, mas este é realmente apenas um exemplo do que você pode fazer em alguns minutos com a prática. (Demorei muito mais para digitar essa resposta do que realmente editar o código SVG.)
Finalmente, compactar esse código SVG com gzip reduz para apenas 1846 bytes (!), Pouco mais de um quarto do tamanho da sua versão JPEG.
fonte
Estou um pouco surpreso que ninguém tenha mencionado a extensão " Scour ". Ele vem com o Inkscape (a partir da v0.47) e faz muitas das otimizações mencionadas por Ilmari Karonen.
fonte
Você pode convertê-lo em um SVG compactado (SVGZ) e colocar o image.svgz em sua página da web:
Ou, no Adobe Illustrator, basta salvar como "SVG compactado", que gravará um arquivo image.svgz.
Para sua imagem de teste, ela ainda é maior que o JPG:
fonte
Encontrei recentemente uma ferramenta em https://petercollingridge.appspot.com/svg-editor ( código fonte ) que ajuda a otimizar arquivos SVG. Ele tem bons resultados nesse caso, diminuindo o tamanho do arquivo para 3.7kB, que é pouco mais da metade do tamanho do JPG, com um pequeno ajuste manual:
O uso dessa ferramenta para otimizar arquivos SVG requer muito menos tempo do que jogar o arquivo manualmente.
fonte
SVGOMG!é um aplicativo Web impressionante para otimização SVG
De acordo com o criador do aplicativo, SVGOMG é SVGO " 's M Issing G UI".
Executá-lo na imagem fornecida reduz a apenas
3.42kb
e logo1.4kb
após ser compactado.fonte
<radialGradient>
e<path>
do meu código otimizado para mão, o SVGOMG otimiza a imagem resultante de 5,8 kB até 4,02 kB (4,11 kB prettificados) e parece fazer um trabalho bastante completo; Realmente não vejo oportunidades perdidas óbvias. (Jogar com ele um pouco mais, eu notei que às vezes não consegue fundir grupos consecutivos com attrs idênticos; Inkscape, por vezes, parece gerar aqueles, por exemplo, ao ajustar a página para caber o desenho.)