juzaweb / image-optimizer
使用PHP轻松优化图像
Requires
- php: ^7.2|^8.0
- ext-fileinfo: *
- psr/log: ^1.0
- symfony/process: ^4.2|^5.0
Requires (Dev)
- phpunit/phpunit: ^8.0|^9.0
- symfony/var-dumper: ^4.2|^5.0
README
此包可以通过一系列各种图像优化工具来优化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
通过运行JpegOptim来减小JPG的大小。这些选项被使用
-m85
:这将以85%的质量存储图像。此设置似乎可以满足Google的Pagespeed压缩规则--strip-all
:这将删除所有文本信息,如注释和EXIF数据--all-progressive
:这将确保生成的图像是渐进式的,这意味着可以通过多次下载使用更高细节的渐进式细节。
PNGs
通过运行两个工具来减小PNG的大小。第一个是Pngquant 2,一个有损PNG压缩器。我们未设置任何额外选项,使用默认选项。然后我们运行图像通过第二个:Optipng。这些选项被使用
-i0
:这将生成一个非交错、渐进式扫描的图像-o2
:将优化级别设置为二级(多个IDAT压缩尝试)
SVG文件
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 获取详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。
明信片软件
您可以使用此包(它是 MIT-授权的),但如果它进入了您的生产环境,我们非常感激您寄给我们一张来自家乡的明信片,说明您正在使用我们哪个包。
我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。
我们将所有收到的明信片 发布在我们的公司网站上。
致谢
本包受到了 psliwa/image-optimizer 的启发
由 Joke Forment 提供“情感支持”
许可证
MIT许可证(MIT)。有关更多信息,请参阅 许可证文件。