crashingberries / 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
Requires (Dev)
- pestphp/pest: ^1.21
- phpunit/phpunit: ^8.5.21|^9.4.4
- symfony/var-dumper: ^4.2|^5.0|^6.0
README
使用PHP轻松优化图片
此包可以通过一系列图像优化工具对PNG、JPG、SVG和GIF进行优化。以下是使用方法
use Spatie\ImageOptimizer\OptimizerChainFactory; $optimizerChain = OptimizerChainFactory::create(); $optimizerChain->optimize($pathToImage);
位于 $pathToImage
的图像将被优化版本覆盖,通常会更小。该包将自动检测您的系统上安装了哪些优化二进制文件并使用它们。
以下是此包已完成的示例转换。
喜欢Laravel吗?那么请前往针对Laravel的特定集成。
使用WordPress吗?那么请尝试WP CLI命令。
支持我们
我们投入了大量资源来创建一流的开放源代码包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从家乡寄给我们明信片,说明您正在使用我们的哪些包。您可以在我们的联系页面上找到我们的地址。我们将所有收到的明信片发布在我们的虚拟明信片墙上。
安装
您可以通过composer安装此包
composer require spatie/image-optimizer
优化工具
如果您的系统上存在这些优化器,包将使用它们
以下是在Ubuntu上安装所有优化器的步骤
sudo apt-get install jpegoptim sudo apt-get install optipng sudo apt-get install pngquant sudo npm install -g svgo@1.3.2 sudo apt-get install gifsicle sudo apt-get install webp
以下是在MacOS上安装二进制文件的步骤(使用Homebrew)
brew install jpegoptim brew install optipng brew install pngquant npm install -g svgo@1.3.2 brew install gifsicle brew install webp
以下是在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@1.3.2 sudo dnf install gifsicle sudo dnf install libwebp-tools
哪些工具会做什么?
包将自动决定针对特定图像使用哪些工具。
JPGs
JPGs将通过JpegOptim进行优化,以减小其大小。以下选项将被使用
-m85
:这将使用85%的质量存储图像。此设置似乎可以满足Google Pagespeed压缩规则--strip-all
:这将删除所有文本信息,例如注释和EXIF数据--all-progressive
:这将确保生成的图像是渐进式的,这意味着可以使用多个传递来下载具有逐次更高细节的图像。
PNGs
PNGs将通过两个工具进行优化。第一个是Pngquant 2,一个有损PNG压缩器。我们未设置任何额外选项,使用它们的默认值。然后我们运行图像通过第二个工具:Optipng。以下选项将被使用
-i0
:这将生成一个非交错、渐进式扫描的图像-o2
:这将优化级别设置为2(多次IDAT压缩尝试)
SVGs
SVG文件将被SVGO 1压缩。将使用SVGO的默认配置,省略了cleanupIDs
插件,因为已知该插件在单个页面上显示多个优化后的SVG时可能会引起问题。
请注意,SVGO可能会破坏您的SVG。有关更多信息,请参阅这篇出色的博客文章,作者是Sara Soueidan。
目前,用于SVGO的默认配置仅与SVGO 1.x兼容。要使用与SVGO 2.x兼容的选项,您需要创建自己的优化链。
GIF文件
GIF文件将使用Gifsicle进行优化。将使用以下选项
-O3
:将优化级别设置为Gifsicle的最大值,这会产生最慢但最好的结果
WEBP文件
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 '保存为网页' | PNG-24带有透明度
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以获取详细信息。
安全性
如果您发现与安全相关的错误,请通过security@spatie.be发送邮件,而不是使用问题跟踪器。
明信片软件
您可以使用此包(它是MIT许可),但如果它进入了您的生产环境,我们非常感谢您从您的家乡寄给我们一张明信片,注明您正在使用我们哪个包。
我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。
我们将所有收到的明信片发布在我们的公司网站上。
致谢
本包受到psliwa/image-optimizer的启发
由Joke Forment提供情感支持
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。