spatie / image-optimizer
使用PHP轻松优化图像
Requires
- php: ^7.3|^8.0
- ext-fileinfo: *
- psr/log: ^1.0 | ^2.0 | ^3.0
- symfony/process: ^4.2|^5.0|^6.0|^7.0
Requires (Dev)
- pestphp/pest: ^1.21
- phpunit/phpunit: ^8.5.21|^9.4.4
- symfony/var-dumper: ^4.2|^5.0|^6.0|^7.0
This package is auto-updated.
Last update: 2024-09-08 18:26:06 UTC
README
本包可以通过一系列图像优化工具对PNGs、JPGs、WEBPs、AVIFs、SVGs和GIFs进行优化。以下是使用方法
use Spatie\ImageOptimizer\OptimizerChainFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain->optimize($pathToImage);
位于 $pathToImage
的图像将被覆盖,以较小的优化版本。包将自动检测您的系统上安装了哪些优化二进制文件,并使用它们。
以下是本包已完成的一些示例转换。
喜欢Laravel?那么请访问特定于Laravel的集成。
使用WordPress?那么请尝试WP CLI命令。
SilverStripe爱好者?别浪费时间,去SilverStripe模块。
支持我们
我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从家乡给我们寄来明信片,说明您正在使用我们的哪个包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上。
安装
您可以通过composer安装此包
composer require spatie/image-optimizer
优化工具
如果系统上存在,该包将使用这些优化器
以下是在Ubuntu/Debian上安装所有优化器的说明
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
sudo apt-get install libavif-bin # minimum 0.9.3
以下是在MacOS上安装二进制文件的说明(使用Homebrew)
brew install jpegoptim brew install optipng brew install pngquant npm install -g svgo brew install gifsicle brew install webp brew install libavif
以下是在Fedora/RHEL/CentOS上安装二进制文件的说明
sudo dnf install epel-release sudo dnf install jpegoptim sudo dnf install optipng sudo dnf install pngquant sudo npm install -g svgo sudo dnf install gifsicle sudo dnf install libwebp-tools sudo dnf install libavif-tools
哪些工具会做什么?
包将自动决定针对特定图像使用哪些工具。
JPGs
通过运行JpegOptim,JPGs将被减小。使用以下选项
-m85
:这将使用85%的质量存储图像。此设置似乎满足Google的Pagespeed压缩规则--strip-all
:这将删除所有文本信息,例如注释和EXIF数据--all-progressive
:这将确保生成的图像是渐进式的,这意味着可以使用多个遍历逐步更高的细节来下载。
PNGs
通过运行两个工具来减小PNGs。第一个是Pngquant 2,一个有损PNG压缩器。我们未设置任何额外选项,使用默认选项。然后我们运行图像通过第二个:Optipng。使用以下选项
-i0
:这将生成一个非交织、渐进式扫描的图像-o2
:将优化级别设置为二(多个IDAT压缩尝试)
SVGs
SVGs将通过SVGO进行压缩。将使用SVGO的默认配置,但会省略cleanupIDs
和removeViewBox
插件,因为这些插件在单个页面上显示多个优化后的SVG时可能会引起问题。
请注意,SVGO可能会破坏您的SVG。您可以在Sara Soueidan的这篇优秀的博客文章中找到更多关于此的信息。
GIFs
GIFs将通过Gifsicle进行优化。将使用以下选项
-O3
:将优化级别设置为Gifsicle的最大值,这会产生最慢但最好的结果
WEBPs
WEBPs将通过Cwebp进行优化。将使用以下选项
-m 6
:使用最慢的压缩方法以获得最佳的压缩效果。-pass 10
:最大化分析遍历次数。-mt
多线程以获得一些速度提升。-q 90
:质量因子带来的最小可察觉的变化。
(设置是从这里取出的)
AVIFs
AVIFs将通过avifenc进行优化。将使用以下选项
-a cq-level=23
:常量质量级别。值越低,质量越好,文件大小越大(0-63)。-j all
:工作数量(工作线程,“all”使用所有可用核心)。--min 0
:颜色的最小量化器(0-63)。--max 63
:颜色的最大量化器(0-63)。--minalpha 0
:alpha的最小量化器(0-63)。--maxalpha 63
:alpha的最大量化器(0-63)。-a end-usage=q
:速率控制模式设置为常量质量模式。-a tune=ssim
:将SSIM作为失真度量调整编码器。
使用方法
这是使用该包的默认方式
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
的构造函数来传递一个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
,执行了哪些命令以及它们的输出。
示例转换
以下是该软件包完成的几个实际示例转换。
JPG、WEBP、AVIF图像的转换方法:将原始图像输入到spatie/image(使用默认GD驱动程序)并调整到2048像素宽度
Spatie\Image\Image::load('original.jpg') ->width(2048) ->save('image.jpg'); // image.png, image.webp, image.avif
jpg
优化
511 KB (-33.7%,DSSIM:0.00052061)
来源:Jeff Sheldon,通过Unsplash
webp
优化
184 KB (-60.0%,DSSIM:0.00166036)
来源:Jeff Sheldon,通过Unsplash
avif
优化
194 KB (-73.2%,DSSIM:0.00163751)
来源:Jeff Sheldon,通过Unsplash
png
原始:Photoshop '保存为网页' | 透明PNG-24
39 KB
优化
16 KB (-59%,DSSIM:0.00000251)
svg
原始:Illustrator | 网页优化SVG导出
25 KB
优化
20 KB (-21.5%)
变更日志
请参阅变更日志获取关于最近更改的更多信息。
测试
composer test
贡献
有关详细信息,请参阅贡献指南。
安全
如果您发现与安全相关的错误,请发送电子邮件至[email protected],而不是使用问题跟踪器。
Postcardware
您可以自由使用此软件包(它遵循MIT许可证),但如果它进入了您的生产环境,我们非常欢迎您从家乡给我们寄一张明信片,说明您正在使用我们的哪个包。
我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。
我们将所有收到的明信片发布在我们的公司网站上。
致谢
此包受到psliwa/image-optimizer的启发
情感支持由Joke Forment提供
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。