flynsarmy / image-optimizer
图像优化/压缩库。这个库可以非常方便地优化 png、jpg 和 gif 文件。它使用了 optipng、pngquant、pngcrush、pngout、gifsicle、jpegoptim 和 jpegtran 工具。
Requires
- php: ^8.0 | ^8.1
- psr/log: ^1.0
- symfony/options-resolver: ~5.0 | ~6.0
- symfony/process: ~5.0 | ~6.0
Requires (Dev)
- ext-gd: *
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ~9.5
- squizlabs/php_codesniffer: ~3.6
README
是 ps/image-optimizer 的分支,增加了许多改进。详情请见 变更日志。
这是一个方便且易于使用的图像文件优化器。它使用了 optipng、pngquant、jpegoptim、svgo 等库。因此,在开始使用之前,您应该在服务器上安装相应的库。项目中包含 Vagrantfile,它定义了一个带有所有库的测试虚拟机,您可以检查 Vagrantfile 了解如何安装所有这些库。
感谢 ImageOptimizer 及其使用的库,您的图像文件可以缩小到原来的 10%-70%。
安装
使用 composer
composer require flynsarmy/image-optimizer
基本用法
$factory = new \ImageOptimizer\OptimizerFactory(); $optimizer = $factory->get(); $filepath = /* path to image */; $optimizer->optimize($filepath); //optimized file overwrites original one
配置
默认情况下,优化器不会抛出任何异常。如果文件无法优化或未安装针对给定文件的优化库,优化器将不会修改原始文件。当您希望最终优化用户上传的文件时,这种行为是可接受的。当您的用例中优化错误应该导致异常时,已创建了 ignore_errors 选项。
这个库非常智能,您无需配置 ImageOptimizer 所使用的所有库的二进制文件路径,库将在几个位置查找这些二进制文件,所以如果二进制文件放在标准位置,它将自动找到。
支持选项
ignore_errors(默认: true)single_optimizer_timeout_in_seconds(默认: 60) - 当您想控制优化持续的时间时非常有用。例如,在某些情况下,当优化花费大量时间时,可能不值得进行优化。通过传递null来关闭超时。output_filepath_pattern(默认:%basename%/%filename%%ext%) - 优化文件将被存储的路径。默认情况下,它将覆盖原始文件。有 3 个占位符:%basename%、%filename%(不带扩展名和点)和%ext%(带点的扩展名),它们将被原始文件中的值替换。execute_only_first_png_optimizer(默认: true) - 执行第一个成功的或所有png优化器execute_only_first_jpeg_optimizer(默认: true) - 执行第一个成功的或所有jpeg优化器optipng_options(默认:array('-i0', '-o2', '-quiet')) - 传递给库的参数数组pngquant_options(默认:array('--force'))pngcrush_options(默认:array('-reduce', '-q', '-ow'))pngout_options(默认:array('-s3', '-q', '-y'))advpng_options(默认:array('-z', '-4', '-q'))gifsicle_options(默认:array('-b', '-O5'))jpegoptim_options(默认:array('--strip-all', '--all-progressive'))jpegtran_options(默认:array('-optimize', '-progressive'))svgo_options(默认:array('--disable=cleanupIDs'))custom_optimizers(默认array())optipng_bin(默认: 将被猜测) - 您可以强制指定二进制文件的路径,但默认情况下它将被猜测pngquant_binpngcrush_binpngout_binadvpng_bingifsicle_binjpegoptim_binjpegtran_binsvgo_bin
您可以将选项数组作为ImageOptimizer\OptimizerFactory构造函数的第一个参数传递。第二个参数是可选的Psr\LoggerInterface。
$factory = new \ImageOptimizer\OptimizerFactory(array('ignore_errors' => false), $logger);
支持的优化器
- 默认(
smart)- 它猜测文件类型并为该文件类型选择优化器 png- png文件的优化器链,默认使用pngquant和optipng。其中pngquant是损失优化jpg- 将执行两个优化中的第一个:jpegtran或jpegoptimgif-gifsicle的别名pngquant- 主页optipng- 主页pngcrush- 主页pngout- 主页advpng- 主页jpegtran- 主页jpegoptim- 主页gifsicle- 主页svgo- 主页
您可以通过将优化器的名称传递给ImageOptimizer\OptimizerFactory::get方法来获取具体的优化器
//default optimizer is `smart` $optimizer = $factory->get(); //png optimizer $pngOptimizer = $factory->get('png'); //jpegoptim optimizer etc. $jpgOptimizer = $factory->get('jpegoptim');
自定义优化器
您可以轻松地定义自定义优化器
$factory = new \ImageOptimizer\OptimizerFactory(array('custom_optimizers' => array( 'some_optimizier' => array( 'command' => 'some_command', 'args' => array('-some-flag') ) )), $logger);
然后使用
$customOptimizer = $factory->get('some_optimizier');
检查您的系统上安装了哪些优化器
以下代码将针对每个可执行文件运行which以确定它们是否已安装在您的系统上,并返回一个真/假结果列表。
$factory = new \ImageOptimizer\OptimizerFactory(); print_r($factory->checkOptimizers());
我得到了"所有优化器都无法优化该文件"的结果
可能您没有安装所需的优化器。让我们看一下Vagrantfile文件,以查看如何安装这些命令的示例。
为了查看所有中间错误,您可以使用记录器(默认情况下使用NullLogger,因此日志不可用)
class StdoutLogger extends \Psr\Log\AbstractLogger { public function log($level, $message, array $context = array()) { echo $message."\n"; } } $factory = new \ImageOptimizer\OptimizerFactory(array(), new StdoutLogger()); $factory->get()->optimize('yourfile.jpg'); // and have a look at stdout
许可证
MIT