xbing2002 / image-optimizer
使用PHP轻松优化图片
Requires
- php: ^7.2
- ext-fileinfo: *
- psr/log: ^1.0
- symfony/process: ^4.2
Requires (Dev)
- phpunit/phpunit: ^8.0
- symfony/var-dumper: ^4.2
README
本软件包可以通过一系列图像优化工具来优化PNG、JPG、SVG和GIF文件。以下是使用方法
use Spatie\ImageOptimizer\OptimizerChainFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain->optimize($pathToImage);
位于$pathToImage
的图片将被优化版本覆盖,优化后的图片应该更小。该软件包将自动检测您的系统上安装了哪些优化二进制文件,并使用它们。
以下是本软件包已完成的示例转换。
喜欢Laravel?那么请前往针对Laravel的特定集成。
使用WordPress?那么请尝试WP CLI命令。
安装
您可以通过composer安装此软件包
composer require xbing2002/image-optimizer dev-master
优化工具
如果您的系统上存在以下优化器,则软件包将使用它们
以下是如何在Ubuntu上安装所有优化器的方法
sudo apt-get install jpegoptim sudo apt-get install optipng sudo apt-get install pngquant sudo npm install -g svgo sudo apt-get install gifsicle sudo apt-get install webp
以下是如何在MacOS上安装二进制文件的方法(使用Homebrew)
brew install jpegoptim brew install optipng brew install pngquant brew install svgo brew install gifsicle brew install webp
哪些工具会做什么?
软件包将自动决定对特定图像使用哪些工具。
JPGs
通过JpegOptim运行JPG,可以减小它们的尺寸。这些选项被使用
-m85
:这将以85%的质量存储图像。这个设置似乎满足了Google的Pagespeed压缩规则--strip-all
:这将删除所有文本信息,如注释和EXIF数据--all-progressive
:这将确保生成的图像是渐进式的,这意味着可以使用多个逐步提高细节的步骤来下载。
PNGs
通过运行两个工具来减小PNG的尺寸。第一个是Pngquant 2,一个有损PNG压缩器。我们未设置任何额外选项,使用它们的默认值。然后我们运行图像通过第二个工具:Optipng。这些选项被使用
-i0
:这将生成一个非交错、渐进式扫描的图像-o2
:这将优化级别设置为2(多个IDAT压缩尝试)
SVGs
通过SVGO压缩SVG。将使用SVGO的默认配置,省略了cleanupIDs
插件,因为它已知在单个页面上显示多个优化SVG时会引起问题。
请注意,SVGO可能会破坏您的svg。您可以在Sara Soueidan的这篇优秀博客文章中找到更多信息。
GIFs
通过Gifsicle优化GIF。将使用以下选项
-O3
:这将优化级别设置为Gifsicle的最大值,这将产生最慢但最好的结果
WEBPs
WEBP 图片将通过 Cwebp 进行优化。以下选项将被使用:
- 使用
-m 6
以获得最慢的压缩方法,从而实现最佳的压缩效果。 - 使用
-pass 10
以最大化分析遍数。 - 使用
-mt
多线程以获得一些速度提升。 - 使用
-q 90
质量因子,它带来的变化最不易察觉。
(设置来自 这里)
使用方法
这是使用该包的默认方式
use Spatie\ImageOptimizer\OptimizerChainFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain->optimize($pathToImage);
位于 $pathToImage
的图片将被一个更小的优化版本覆盖。
该包会自动检测您系统上安装了哪些优化二进制文件,并使用它们。
如果您想保留原始图片,可以通过传递一个名为 optimize
的第二个参数。
use Spatie\ImageOptimizer\OptimizerChainFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain->optimize($pathToImage, $pathToOutput);
在上述示例中,该包不会修改 $pathToImage
,而是将优化后的版本写入到 $pathToOutput
。
设置超时时间
您可以通过调用 setTimeout
来设置链中每个优化器最多可使用多少秒。
$optimizerChain ->setTimeout(10) ->optimize($pathToImage);
在此示例中,链中的每个优化器将获得最多 10 秒的时间来完成其工作。
创建自己的优化链
如果您想自定义优化器的链,可以通过将 Optimizer
手动添加到 OptimizerChain
来实现。
以下是一个示例,我们只想使用 optipng
和 jpegoptim
。
use Spatie\ImageOptimizer\OptimizerChain; use Spatie\ImageOptimizer\Optimizers\Jpegoptim; use Spatie\ImageOptimizer\Optimizers\Pngquant; $optimizerChain = (new OptimizerChain) ->addOptimizer(new Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(new Pngquant([ '--force', ]))
请注意,您可以将 Optimizer
应用的选项传递给其构造函数。
编写自定义优化器
想要使用其他命令行工具来优化您的图片?没问题。只需编写自己的优化器。任何实现 Spatie\ImageOptimizer\Optimizers\Optimizer
接口的对象都可以是优化器。
namespace Spatie\ImageOptimizer\Optimizers; use Spatie\ImageOptimizer\Image; interface Optimizer { /** * Returns the name of the binary to be executed. * * @return string */ public function binaryName(): string; /** * Determines if the given image can be handled by the optimizer. * * @param \Spatie\ImageOptimizer\Image $image * * @return bool */ public function canHandle(Image $image): bool; /** * Set the path to the image that should be optimized. * * @param string $imagePath * * @return $this */ public function setImagePath(string $imagePath); /** * Set the options the optimizer should use. * * @param array $options * * @return $this */ public function setOptions(array $options = []); /** * Get the command that should be executed. * * @return string */ public function getCommand(): string; }
如果您想查看示例实现,请查看此包附带的一些现有优化器 (请查看现有优化器)。
您可以通过在 OptimizerChain
上使用 addOptimizer
方法轻松添加自己的优化器。
use Spatie\ImageOptimizer\ImageOptimizerFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain ->addOptimizer(new YourCustomOptimizer()) ->optimize($pathToImage);
记录优化过程
默认情况下,该包不会抛出任何错误,只是默默地操作。要验证该包正在做什么,您可以设置一个记录器。
use Spatie\ImageOptimizer\OptimizerChainFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain ->useLogger(new MyLogger()) ->optimize($pathToImage);
记录器是实现了 Psr\Log\LoggerInterface
的一个类。一个完全符合规范的好记录库是 Monolog。该包将记录使用哪些 Optimizers
、执行了哪些命令以及它们的输出。
示例转换
以下是一些由该包执行的实时示例转换。
png
原始:Photoshop '网页保存' | 24 位 PNG 透明度
40 KB
优化
16 KB(40%)
jpg
原始:Photoshop '网页保存' | 质量 60,优化
547 KB
优化
525 KB(95%)
致谢:Jeff Sheldon,via Unsplash
svg
原始:Illustrator | 网页优化 SVG 导出
26 KB
优化
20 KB(76%)
webp
原始:WebPonize
528 KB
优化
328 KB(89%)
致谢:Jeff Sheldon,via Unsplash
变更日志
请参阅 CHANGELOG 了解最近更改的信息。
测试
composer test
贡献
请参阅 CONTRIBUTING 了解详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。
明信片软件
您可自由使用此包(它遵循MIT许可协议),但如果它进入您的生产环境,我们非常感谢您从家乡寄给我们一张明信片,注明您正在使用我们的哪个包。
我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。
我们将所有收到的明信片发布在我们的公司网站上。
致谢
本包的灵感来源于psliwa/image-optimizer
感谢Joke Forment提供的情感支持
支持我们
Spatie是一家位于比利时的安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述这里。
您的业务依赖于我们的贡献吗?在Patreon上联系我们并提供支持。所有承诺都将用于分配人力以维护和开发新功能。
许可协议
MIT许可协议(MIT)。有关更多信息,请参阅许可文件。