
php-svg-optimizer é uma biblioteca PHP projetada para otimizar os arquivos SVG aplicando várias transformações e operações de limpeza. A biblioteca garante que os arquivos SVG otimizados sejam compatíveis com as especificações do SVG 2.0 .
A ferramenta se esforça para otimizar o máximo possível sem perder dados que possam distorcer a qualidade da imagem, garantindo que o SVG resultante permaneça visualmente idêntico ao original, sendo mais eficiente em termos de tamanho e desempenho.
| Versão | Php | Documentação |
|---|---|---|
| ^5.1 | ^8.3 | atual |
ext-dom : Extensão PHP necessária para manuseio XML.ext-libxml : Extensão PHP necessária para manuseio de erros XML.Para instalar a biblioteca, execute:
composer require mathiasreker/php-svg-optimizerVocê pode usar esta biblioteca como uma ferramenta de linha de comando (CLI) ou como um pacote independente .
vendor/bin/svg-optimizer [options] process < path 1> < path 2> ...Options:
-h , --help Display help for the command.
-c , --config Path to a JSON file with custom optimization rules. If not provided, all default optimizations will be applied.
-d , --dry-run Only calculate potential savings without modifying the files.
-q , --quiet Suppress all output except errors.
-v , --version Display the version of the library.
Commands:
Process Provide a list of directories or files to process.vendor/bin/svg-optimizer --dry-run process /path/to/svgs
vendor/bin/svg-optimizer --config=config.json process /path/to/file.svg
vendor/bin/svg-optimizer --quiet process /path/to/file.svg{
"convertColorsToHex" : true ,
"flattenGroups" : true ,
"minifySvgCoordinates" : true ,
"minifyTransformations" : true ,
"removeComments" : true ,
"removeDefaultAttributes" : true ,
"removeDeprecatedAttributes" : true ,
"removeDoctype" : true ,
"removeEnableBackgroundAttribute" : true ,
"removeEmptyAttributes" : true ,
"removeMetadata" : true ,
"removeTitleAndDesc" : true ,
"removeUnnecessaryWhitespace" : true ,
"sortAttributes" : true
}Para garantir a robustez ao usar a biblioteca, é crucial lidar com exceções, pois os arquivos SVG inválidos ou malformados podem levar a erros de tempo de execução. A captura dessas exceções permitirá que você gerencie possíveis problemas de forma graciosa e impedirá que seu aplicativo trava.
<?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use MathiasReker PhpSvgOptimizer Services SvgOptimizerService ;
try {
$ svgOptimizer = SvgOptimizerService:: fromFile ( ' path/to/source.svg ' )
-> withRules (
convertColorsToHex: true ,
flattenGroups: true ,
minifySvgCoordinates: true ,
minifyTransformations: true ,
removeComments: true ,
removeDefaultAttributes: true ,
removeDeprecatedAttributes: true ,
removeDoctype: true ,
removeEnableBackgroundAttribute: true ,
removeEmptyAttributes: true ,
removeMetadata: true ,
removeTitleAndDesc: false ,
removeUnnecessaryWhitespace: true ,
sortAttributes: true ,
)
-> optimize ()
-> saveToFile ( ' path/to/output.svg ' );
} catch ( Exception $ exception ) {
echo $ exception -> getMessage ();
} <?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use MathiasReker PhpSvgOptimizer Services SvgOptimizerService ;
try {
$ svgOptimizer = SvgOptimizerService:: fromFile ( ' path/to/source.svg ' )
-> optimize ()
-> saveToFile ( ' path/to/output.svg ' );
$ metaData = $ svgOptimizer -> getMetaData ();
echo sprintf ( ' Optimized size: %d bytes%s ' , $ metaData -> getOptimizedSize (), PHP_EOL );
echo sprintf ( ' Original size: %d bytes%s ' , $ metaData -> getOriginalSize (), PHP_EOL );
echo sprintf ( ' Size reduction: %d bytes%s ' , $ metaData -> getSavedBytes (), PHP_EOL );
echo sprintf ( ' Reduction percentage: %s %%%s ' , $ metaData -> getSavedPercentage (), PHP_EOL );
} catch ( Exception $ exception ) {
echo $ exception -> getMessage ();
} <?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use MathiasReker PhpSvgOptimizer Services SvgOptimizerService ;
try {
$ svgOptimizer = SvgOptimizerService:: fromFile ( ' path/to/source.svg ' )
-> optimize ();
echo sprintf ( ' Get content: ' , $ svgOptimizer -> getContent (), PHP_EOL );
$ metaData = $ svgOptimizer -> getMetaData ();
echo sprintf ( ' Optimized size: %d bytes%s ' , $ metaData -> getOptimizedSize (), PHP_EOL );
echo sprintf ( ' Original size: %d bytes%s ' , $ metaData -> getOriginalSize (), PHP_EOL );
echo sprintf ( ' Size reduction: %d bytes%s ' , $ metaData -> getSavedBytes (), PHP_EOL );
echo sprintf ( ' Reduction percentage: %s %%%s ' , $ metaData -> getSavedPercentage (), PHP_EOL );
} catch ( Exception $ exception ) {
echo $ exception -> getMessage ();
} <?php
declare (strict_types= 1 );
require_once __DIR__ . ' /vendor/autoload.php ' ;
use MathiasReker PhpSvgOptimizer Services SvgOptimizerService ;
try {
$ svgOptimizer = SvgOptimizerService:: fromString ( ' <svg>...</svg> ' )
-> optimize ();
echo sprintf ( ' Content: ' , $ svgOptimizer -> getContent (), PHP_EOL );
$ metaData = $ svgOptimizer -> getMetaData ();
echo sprintf ( ' Optimized size: %d bytes%s ' , $ metaData -> getOptimizedSize (), PHP_EOL );
echo sprintf ( ' Original size: %d bytes%s ' , $ metaData -> getOriginalSize (), PHP_EOL );
echo sprintf ( ' Size reduction: %d bytes%s ' , $ metaData -> getSavedBytes (), PHP_EOL );
echo sprintf ( ' Reduction percentage: %s %%%s ' , $ metaData -> getSavedPercentage (), PHP_EOL );
} catch ( Exception $ exception ) {
echo $ exception -> getMessage ();
} Método de fábrica estática para criar SvgOptimizerService a partir de um caminho de arquivo.
$ svgOptimizer = SvgOptimizerService:: fromFile ( ' path/to/source.svg ' ); Método estático de fábrica para criar SvgOptimizerService a partir de uma string.
$ svgOptimizer = SvgOptimizerService:: fromString ( ' <svg>...</svg> ' );withRulesConfigure quais regras de otimização do SVG a serem aplicadas. O método aceita parâmetros booleanos que determinam se regras específicas devem ser ativadas ou desativadas.
Remove <title> e <desc> tags do SVG:
$ svgOptimizer -> withRules (removeTitleAndDesc: true );Remove todos os comentários do SVG:
$ svgOptimizer -> withRules (removeComments: true );Limpa o espaço de branco desnecessário no SVG:
$ svgOptimizer -> withRules (removeUnnecessaryWhitespace: true );Classifica os atributos dentro de cada elemento:
$ svgOptimizer -> withRules (sortAttributes: true );Remove os valores de atributo padrão que correspondem aos padrões comuns:
$ svgOptimizer -> withRules (removeDefaultAttributes: true );Remove atributos depreciados do SVG:
$ svgOptimizer -> withRules (removeDeprecatedAttributes: true ); Remove as tags <metadata> do SVG:
$ svgOptimizer -> withRules (removeMetadata: true ); Aplica os elementos <g> , movendo seus elementos filhos para o nó dos pais:
$ svgOptimizer -> withRules (flattenGroups: true ); Converte os valores de cor rgb() em formato hexadecimal:
$ svgOptimizer -> withRules (convertColorsToHex: true );Minifica os valores de coordenadas removendo precisão desnecessária:
$ svgOptimizer -> withRules (minifySvgCoordinates: true );Minifica os atributos de transformação removendo valores redundantes:
$ svgOptimizer -> withRules (minifyTransformations: true );Remove a declaração SVG Doctype:
$ svgOptimizer -> withRules (removeDoctype: true ); Remove o atributo enable-background do SVG:
$ svgOptimizer -> withRules (removeEnableBackgroundAttribute: true );Remove atributos vazios do SVG:
$ svgOptimizer -> withRules (removeEmptyAttributes: true );Todas as opções são definidas como true por padrão. Você pode configurá -los individualmente, passando os valores desejados:
$ svgOptimizer -> withRules (
convertColorsToHex: true ,
flattenGroups: true ,
minifySvgCoordinates: true ,
minifyTransformations: true ,
removeComments: true ,
removeDefaultAttributes: true ,
removeDeprecatedAttributes: true ,
removeDoctype: true ,
removeEmptyAttributes: true ,
removeMetadata: true ,
removeTitleAndDesc: true ,
removeUnnecessaryWhitespace: true ,
sortAttributes: true ,
);optimize o métodoFinaliza o processo de otimização e gera o arquivo SVG otimizado.
$ svgOptimizer -> optimize ();saveToFileSalva o arquivo SVG otimizado no caminho especificado.
$ svgOptimizer -> saveToFile ( ' path/to/output.svg ' );getContentRetorna o conteúdo SVG otimizado.
$ svgOptimizer -> getContent ();getOptimizedSizeRetorna o tamanho do arquivo SVG otimizado.
$ svgOptimizer -> getMetaData ()-> getOptimizedSize ();getOriginalSizeRetorna o tamanho do arquivo SVG original.
$ svgOptimizer -> getMetaData ()-> getOriginalSize ();getSavedBytesRetorna o número de bytes salvos pelo processo de otimização.
$ svgOptimizer -> getMetaData ()-> getSavedBytes ();getSavedPercentageRetorna a porcentagem de bytes salvos pelo processo de otimização.
$ svgOptimizer -> getMetaData ()-> getSavedPercentage ();Para uma lista completa dos recursos propostos e problemas conhecidos, consulte os problemas abertos.
Congratulamo -nos com todas as contribuições! Se você tiver idéias para melhorias, sinta -se à vontade para gastar o repositório e enviar uma solicitação de tração. Você também pode abrir um problema. Se você achar esse projeto útil, não se esqueça de dar uma estrela!
A biblioteca implementa o padrão de estratégia, onde as estratégias são encapsuladas como "regras" localizadas no diretório /src/Services/Rules .
Crie a regra :
Implemente o SvgOptimizerRuleInterface , adicionando uma nova classe no diretório /src/Services/Rules .
Escreva testes :
Desenvolva casos de teste abrangentes para sua regra no diretório /tests/Services/Rules para garantir que ela se comporte conforme o esperado.
Integrar a regra :
/src/Services/SvgOptimizerService.php ./src/Commands/SvgOptimizerCommand.php . Atualizar documentação :
Documente a funcionalidade e o objetivo da sua regra no README.md .
Seguir estas etapas garante que sua regra seja perfeitamente integrada ao projeto.
Para usar o projeto com o Docker, você pode iniciar o contêiner usando:
docker-compose up -dEm seguida, acesse o contêiner:
docker exec -it php-svg-optimizer bashRun Phpstan:
composer phpstanExecutar testes:
composer testCódigo de formato:
composer formatEste projeto está licenciado sob a licença do MIT. Consulte o arquivo de licença para obter mais informações.
Embora a ferramenta tenha sido minuciosamente testada e construída de uma maneira que evite mudanças de risco, seu uso é por seu próprio risco. Não podemos garantir que ele será totalmente compatível com todos os arquivos SVG ou fluxos de trabalho. É altamente recomendável testar a ferramenta com arquivos SVG de amostra e garantir a compatibilidade com seu caso de uso específico antes de usá -lo em um ambiente de produção.