scratcher28 / image-optimizer
图片优化/压缩库。这个库能够以非常简单快捷的方式优化png、jpg和gif文件。它使用optipng、pngquant、pngcrush、pngout、gifsicle、jpegoptim和jpegtran工具。
Requires
- php: ^7.0|^8.0
- psr/log: ^1.0
- symfony/options-resolver: ^5.0
- symfony/process: ^6.0
Requires (Dev)
- ext-gd: *
- phpunit/phpunit: ^7.0
README
这个库是方便且易于使用的图片文件优化器。它使用optipng、pngquant、jpegoptim、svgo等库,因此在使用前,您应该在服务器上安装相应的库。项目包含Vagrantfile,其中定义了带有所有库的测试虚拟机,因此您可以通过检查Vagrantfile了解如何安装所有这些内容。
感谢ImageOptimizer及其使用的库,您的图片文件可以减小到原来的10%-70%。
安装
使用composer
composer require ps/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%) - 优化后的文件将存储的目录。默认情况下,它将覆盖原始文件。有三个占位符:- %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_bin
- pngcrush_bin
- pngout_bin
- advpng_bin
- gifsicle_bin
- jpegoptim_bin
- jpegtran_bin
- svgo_bin
您可以将选项数组作为ImageOptimizer\OptimizerFactory构造函数的第一个参数传递。第二个参数是可选的Psr\LoggerInterface。
$factory = new \ImageOptimizer\OptimizerFactory(array('ignore_errors' => false), $logger);
支持的优化器
- 默认(smart)- 猜测文件类型并为该文件类型选择优化器
- png- png文件的优化器链,默认使用- pngquant和- optipng。- pngquant是损失性优化
- jpg- 将执行两种优化中的第一种:- jpegtran或- jpegoptim
- gif-- 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');
我得到了"所有优化器都未能优化文件"
可能您没有安装所需的优化器。让我们看看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