fatonsopa / image-optimizer
使用PHP轻松优化图片
Requires
- php: ^7.0
- psr/log: ^1.0
- symfony/process: ^2.8|^3.0|^4.0
Requires (Dev)
- phpunit/phpunit: ^6.2|^7.0
- symfony/var-dumper: ^3.0|^4.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 sudo apt-get install gifsicle
以下是如何在MacOS(使用Homebrew)上安装二进制文件
brew install jpegoptim brew install optipng brew install pngquant brew install svgo brew install gifsicle
哪些工具会做什么?
包将自动决定针对特定图像使用哪些工具。
JPGs
JPGs将通过JpegOptim变小。使用以下选项
-m85
:这将以85%的质量存储图像。这个设置似乎满足Google的Pagespeed压缩规则--strip-all
:这将删除所有文本信息,如注释和EXIF数据--all-progressive
:这将确保生成的图像是渐进式的,这意味着可以通过多个传递下载使用更高细节的图像。
PNGs
PNGs将通过两个工具变小。第一个是Pngquant 2,一个有损PNG压缩器。我们不设置额外的选项,使用默认选项。然后我们通过第二个工具运行图像:Optipng。使用以下选项
-i0
:这将生成一个非交织的、渐进式扫描的图像-o2
:这将设置优化级别为2(多个IDAT压缩尝试)
SVGs
SVGs将通过SVGO压缩。将使用SVGO的默认配置,省略了cleanupIDs
插件,因为它在单页上显示多个优化SVG时已知会引起问题。
请注意,SVGO可能会破坏您的svg。您可以在Sara Soueidan的这篇优秀博客文章中找到更多关于此的信息。
GIFs
GIFs将通过Gifsicle优化。使用以下选项
-O3
:将优化级别设置为 Gifsicle 的最大值,这将产生最慢但最佳的结果
用法
这是使用此包的默认方式
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%)
变更日志
有关最近更改的更多信息,请参阅变更日志。
测试
composer test
贡献
有关详细信息,请参阅贡献。
安全
如果您发现任何与安全相关的问题,请通过电子邮件freek@spatie.be 报告,而不是使用问题跟踪器。
明信片软件
您可以自由使用此包(它是 MIT 许可),但如果它进入您的生产环境,我们非常感谢您从您的家乡给我们寄一张明信片,说明您正在使用我们哪些包。
我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。
我们将在公司网站上发布所有收到的明信片。点击这里查看。
致谢
本包受到 psliwa/image-optimizer 的启发
感谢 Joke Forment 提供的情感支持
支持我们
Spatie 是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述:点击这里。
您的业务依赖于我们的贡献吗?请在 Patreon 上联系我们并支持我们。所有承诺都将专门用于分配人力进行维护和新酷炫功能。
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。