
php-svg-optimizer es una biblioteca PHP diseñada para optimizar los archivos SVG aplicando varias transformaciones y operaciones de limpieza. La biblioteca asegura que los archivos SVG optimizados cumplan con las especificaciones de SVG 2.0 .
La herramienta se esfuerza por optimizar tanto como sea posible sin perder ningún dato que pueda distorsionar la calidad de la imagen, asegurando que el SVG resultante permanezca visualmente idéntico al original, mientras que es más eficiente en términos de tamaño y rendimiento.
| Versión | Php | Documentación |
|---|---|---|
| ^5.1 | ^8.3 | actual |
ext-dom : Extensión PHP requerida para el manejo de XML.ext-libxml : Extensión PHP requerida para el manejo de errores XML.Para instalar la biblioteca, ejecute:
composer require mathiasreker/php-svg-optimizerPuede usar esta biblioteca como una herramienta de línea de comandos (CLI) o como un paquete independiente .
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 garantizar la robustez al usar la biblioteca, es crucial manejar las excepciones, ya que los archivos SVG inválidos o malformados podrían conducir a errores de tiempo de ejecución. La captura de estas excepciones le permitirá administrar posibles problemas con gracia y evitar que su aplicación se bloquee.
<?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 crear SvgOptimizerService desde una ruta de archivo.
$ svgOptimizer = SvgOptimizerService:: fromFile ( ' path/to/source.svg ' ); Método de fábrica estática para crear SvgOptimizerService a partir de una cadena.
$ svgOptimizer = SvgOptimizerService:: fromString ( ' <svg>...</svg> ' );withRulesConfigure qué reglas de optimización de SVG aplicar. El método acepta parámetros booleanos que determinan si las reglas específicas deben estar habilitadas o deshabilitadas.
Elimina las etiquetas <title> y <desc> del SVG:
$ svgOptimizer -> withRules (removeTitleAndDesc: true );Elimina todos los comentarios del SVG:
$ svgOptimizer -> withRules (removeComments: true );Limpia el espacio en blanco innecesario en el SVG:
$ svgOptimizer -> withRules (removeUnnecessaryWhitespace: true );Clasifica los atributos dentro de cada elemento:
$ svgOptimizer -> withRules (sortAttributes: true );Elimina valores de atributo predeterminados que coincidan con los valores predeterminados comunes:
$ svgOptimizer -> withRules (removeDefaultAttributes: true );Elimina los atributos desaprobados del SVG:
$ svgOptimizer -> withRules (removeDeprecatedAttributes: true ); Elimina las etiquetas <metadata> del SVG:
$ svgOptimizer -> withRules (removeMetadata: true ); Flatens anidados <g> elementos, trasladando los elementos de sus hijos al nodo principal:
$ svgOptimizer -> withRules (flattenGroups: true ); Convierte los valores de color rgb() en formato hexadecimal:
$ svgOptimizer -> withRules (convertColorsToHex: true );Minifica los valores de coordenadas eliminando la precisión innecesaria:
$ svgOptimizer -> withRules (minifySvgCoordinates: true );Minifica los atributos de transformación eliminando valores redundantes:
$ svgOptimizer -> withRules (minifyTransformations: true );Elimina la Declaración de SVG DOCTYPE:
$ svgOptimizer -> withRules (removeDoctype: true ); Elimina el atributo enable-background del SVG:
$ svgOptimizer -> withRules (removeEnableBackgroundAttribute: true );Elimina los atributos vacíos del SVG:
$ svgOptimizer -> withRules (removeEmptyAttributes: true );Todas las opciones se configuran en verdadero de forma predeterminada. Puede configurarlos individualmente pasando los valores deseados:
$ 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 el métodoFinaliza el proceso de optimización y genera el archivo SVG optimizado.
$ svgOptimizer -> optimize ();saveToFileGuarda el archivo SVG optimizado a la ruta especificada.
$ svgOptimizer -> saveToFile ( ' path/to/output.svg ' );getContentDevuelve el contenido SVG optimizado.
$ svgOptimizer -> getContent ();getOptimizedSizeDevuelve el tamaño del archivo SVG optimizado.
$ svgOptimizer -> getMetaData ()-> getOptimizedSize ();getOriginalSize MethodDevuelve el tamaño del archivo SVG original.
$ svgOptimizer -> getMetaData ()-> getOriginalSize ();getSavedBytesDevuelve el número de bytes guardados por el proceso de optimización.
$ svgOptimizer -> getMetaData ()-> getSavedBytes ();getSavedPercentageDevuelve el porcentaje de bytes guardados por el proceso de optimización.
$ svgOptimizer -> getMetaData ()-> getSavedPercentage ();Para obtener una lista completa de características propuestas y problemas conocidos, consulte los problemas abiertos.
¡Agradecemos todas las contribuciones! Si tiene ideas para mejoras, no dude en bifurcar el repositorio y enviar una solicitud de extracción. También puede abrir un problema. Si encuentra útil este proyecto, ¡no olvide darle una estrella!
La biblioteca implementa el patrón de estrategia, donde las estrategias se encapsulan como "reglas" ubicadas en el directorio /src/Services/Rules .
Crear la regla :
Implemente el SvgOptimizerRuleInterface agregando una nueva clase en el directorio /src/Services/Rules .
Escribir pruebas :
Desarrolle casos de prueba integrales para su regla en el directorio /tests/Services/Rules para garantizar que se comporte como se esperaba.
Integrar la regla :
/src/Services/SvgOptimizerService.php ./src/Commands/SvgOptimizerCommand.php . Documentación de actualización :
Documente la funcionalidad y el propósito de su regla en el README.md .
Seguir estos pasos asegura que su regla esté perfectamente integrada en el proyecto.
Para usar el proyecto con Docker, puede iniciar el contenedor usando:
docker-compose up -dLuego, acceda al contenedor:
docker exec -it php-svg-optimizer bashEjecutar phpstan:
composer phpstanEjecutar pruebas:
composer testCódigo de formato:
composer formatEste proyecto tiene licencia bajo la licencia MIT. Consulte el archivo de licencia para obtener más información.
Aunque la herramienta se ha probado a fondo y se construye de una manera que evite cambios riesgosos, su uso es bajo su propio riesgo. No podemos garantizar que sea totalmente compatible con todos los archivos o flujos de trabajo SVG. Se recomienda probar la herramienta con archivos SVG de muestra y garantizar la compatibilidad con su caso de uso específico antes de usarla en un entorno de producción.