mathiasreker/php-svg-optimizer

php-svg-optimizer 是一个PHP库,通过应用各种转换和清理操作来优化SVG文件。

4.0.3 2024-09-22 08:41 UTC

README

Packagist Version Packagist Downloads CI status Contributors Forks Stargazers Issues MIT License

php-svg-optimizer 是一个PHP库,通过应用各种转换和清理操作来优化SVG文件。

版本和依赖关系

要求

  • ext-dom:处理XML所需的PHP扩展。
  • ext-libxml:处理XML错误所需的PHP扩展。

安装

要安装库,请运行

composer require mathiasreker/php-svg-optimizer

为确保库使用时的健壮性,处理异常至关重要,因为无效或格式错误的SVG文件可能导致运行时错误。捕获这些异常将允许您优雅地处理潜在问题,并防止您的应用程序崩溃。

指定规则的示例

<?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(
            removeTitleAndDesc: false,
            removeComments: true,
            removeUnnecessaryWhitespace: true,
            removeDefaultAttributes: false,
            removeMetadata: true,
            flattenGroups: true,
            convertColorsToHex: true,
            minifySvgCoordinates: true,
            minifyTransformations: false,
         )
        ->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\Providers\FileProvider;
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\Providers\StringProvider;
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();
}

使用默认规则从目录解析并优化所有SVG文件(覆盖原始文件)的示例

<?php

declare(strict_types=1);

require_once __DIR__ . '/vendor/autoload.php';

use MathiasReker\PhpSvgOptimizer\Services\Providers\FileProvider;
use MathiasReker\PhpSvgOptimizer\Services\SvgOptimizerService;

$totalOriginalSize = 0;
$totalOptimizedSize = 0;
$optimizedFiles = 0;

$optimizeSvg = function (string $filePath) use (&$totalOriginalSize, &$totalOptimizedSize, &$optimizedFiles): void {
    try {
        $svgOptimizer = SvgOptimizerService::fromFile($filePath)
            ->optimize()
            ->saveToFile($filePath);

        $metaData = $svgOptimizer->getMetaData();
        $totalOriginalSize += $metaData->getOriginalSize();
        $totalOptimizedSize += $metaData->getOptimizedSize();
        ++$optimizedFiles;
    } catch (\Exception) {
        // Skip the file if an exception occurs
    }
};

$directoryPath = 'path/to/directory';

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($directoryPath, FilesystemIterator::SKIP_DOTS),
    RecursiveIteratorIterator::LEAVES_ONLY
);

foreach ($iterator as $fileInfo) {
    if ($fileInfo->isFile() && 'svg' === $fileInfo->getExtension()) {
        $optimizeSvg($fileInfo->getPathname());
    }
}

$reduction = $totalOriginalSize - $totalOptimizedSize;
$reductionPercentage = $totalOriginalSize > 0 ? ($reduction / $totalOriginalSize) * 100 : 0;

echo sprintf('Files optimized: %d%s', $optimizedFiles, \PHP_EOL);
echo sprintf('Total size reduction: %d bytes%s', $reduction, \PHP_EOL);
echo sprintf('Total reduction percentage: %s %%%s', number_format($reductionPercentage, 2), \PHP_EOL);

文档

静态工厂方法,从文件路径创建 SvgOptimizerService

$svgOptimizer = SvgOptimizerService::fromFile('path/to/source.svg');

静态工厂方法,从字符串创建 SvgOptimizerService

$svgOptimizer = SvgOptimizerService::fromString('<svg>...</svg>');

withRules 方法

配置要应用的SVG优化规则。该方法接受布尔参数,用于确定是否启用或禁用特定规则。

参数

从SVG中移除 <title><desc> 标签

$svgOptimizer->withRules(removeTitleAndDesc: true);

从SVG中移除所有注释

$svgOptimizer->withRules(removeComments: true);

清理SVG中的不必要的空白

$svgOptimizer->withRules(removeUnnecessaryWhitespace: true);

移除与常见默认值匹配的默认属性值

$svgOptimizer->withRules(removeDefaultAttributes: true);

从SVG中移除 <metadata> 标签

$svgOptimizer->withRules(removeMetadata: true);

扁平化嵌套的 <g> 元素,将它们的子元素移动到父节点

$svgOptimizer->withRules(flattenGroups: true);

rgb() 颜色值转换为十六进制格式

$svgOptimizer->withRules(convertColorsToHex: true);

通过删除不必要的精度来最小化坐标值

$svgOptimizer->withRules(minifySvgCoordinates: true);

通过删除冗余值来最小化变换属性

$svgOptimizer->withRules(minifyTransformations: true);

所有选项默认设置为true。您可以通过传递所需值来单独配置它们

$svgOptimizer->withRules(
    removeTitleAndDesc: false,
    removeComments: true,
    removeUnnecessaryWhitespace: true,
    removeDefaultAttributes: false,
    removeMetadata: true,
    flattenGroups: true,
    convertColorsToHex: true,
    minifySvgCoordinates: true,
    minifyTransformations: false,
);

optimize 方法

最终确定优化过程并生成优化后的SVG文件。

$svgOptimizer->optimize();

saveToFile 方法

将优化后的SVG文件保存到指定的路径。

$svgOptimizer->saveToFile('path/to/output.svg');

getContent 方法

返回优化后的SVG内容。

$svgOptimizer->getContent();

getOptimizedSize 方法

返回优化后SVG文件的大小。

$svgOptimizer->getMetaData()->getOptimizedSize();

getOriginalSize 方法

返回原始SVG文件的大小。

$svgOptimizer->getMetaData()->getOriginalSize();

getSavedBytes 方法

返回优化过程中节省的字节数。

$svgOptimizer->getMetaData()->getSavedBytes();

getSavedPercentage 方法

返回优化过程中节省的百分比。

$svgOptimizer->getMetaData()->getSavedPercentage();

路线图

有关建议功能和已知问题的完整列表,请参阅 公开问题

贡献

我们欢迎所有贡献!如果您有任何改进建议,请随意克隆存储库并提交拉取请求。您也可以创建一个问题并使用“增强”标签。如果您发现这个项目很有帮助,请不要忘记给它加星!

库结构和贡献指南

该库实现了策略模式,其中策略封装为位于 /src/Services/Rules 目录的“规则”。

添加新规则
  1. 创建规则:在/src/Services/Rules目录中添加一个实现SvgOptimizerRuleInterface的新类。

  2. 编写测试:确保您的新的规则经过彻底测试,在/tests/Services/Rules中创建相应的测试用例。

  3. 集成规则:将您的新规则添加到/src/Services/SvgOptimizerService.php中的构建器。

  4. 更新文档:最后,更新README.md以反映新规则及其目的的添加。

按照这些步骤操作,您将确保您的贡献能够很好地集成到项目中。

Docker

要使用Docker使用该项目,可以使用以下命令启动容器:

docker-compose up -d

然后,访问容器

docker exec -it php-svg-optimizer bash

工具

PHP编码标准修复器

composer cs-fix

PHP编码标准检查器

composer cs-check

PHP Stan (级别9)

composer phpstan

单元测试

composer test

魔法数字检测器

composer magic-number-detector

运行所有格式化工具

composer format

许可协议

该项目采用MIT许可协议。有关更多信息,请参阅LICENSE文件。