spatie/image-optimizer

使用PHP轻松优化图像

安装: 43,971,633

依赖: 88

建议者: 2

安全: 1

星星: 2,672

关注者: 58

分支: 221

公开问题: 0

1.7.5 2024-05-16 08:48 UTC

README

Latest Version on Packagist Tests Total Downloads

本包可以通过一系列图像优化工具对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的默认配置,但会省略cleanupIDsremoveViewBox插件,因为这些插件在单个页面上显示多个优化后的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中来实现。

以下是一个示例,其中我们只想使用optipngjpegoptim

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

Original 原始
771 KB

Optimized 优化
511 KB (-33.7%,DSSIM:0.00052061)

来源:Jeff Sheldon,通过Unsplash

webp

Original 原始
461 KB

Optimized 优化
184 KB (-60.0%,DSSIM:0.00166036)

来源:Jeff Sheldon,通过Unsplash

avif

Original 原始
725 KB

Optimized 优化
194 KB (-73.2%,DSSIM:0.00163751)

来源:Jeff Sheldon,通过Unsplash

png

原始:Photoshop '保存为网页' | 透明PNG-24
39 KB

Original

优化
16 KB (-59%,DSSIM:0.00000251)

Optimized

svg

原始:Illustrator | 网页优化SVG导出
25 KB

Original

优化
20 KB (-21.5%)

Optimized

变更日志

请参阅变更日志获取关于最近更改的更多信息。

测试

composer test

贡献

有关详细信息,请参阅贡献指南

安全

如果您发现与安全相关的错误,请发送电子邮件至[email protected],而不是使用问题跟踪器。

Postcardware

您可以自由使用此软件包(它遵循MIT许可证),但如果它进入了您的生产环境,我们非常欢迎您从家乡给我们寄一张明信片,说明您正在使用我们的哪个包。

我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。

我们将所有收到的明信片发布在我们的公司网站上

致谢

此包受到psliwa/image-optimizer的启发

情感支持由Joke Forment提供

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件