m_arcus/image-optimizer

使用PHP轻松优化图像

1.7.3 2024-01-20 16:14 UTC

This package is auto-updated.

Last update: 2024-09-21 16:46:10 UTC


README

Latest Version on Packagist Tests Total Downloads

此包可以通过一系列图像优化工具对PNG、JPG、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

JPGs将通过JpegOptim来减小大小。这些选项被使用

  • -m85:这将使用85%的质量存储图像。这个设置似乎满足谷歌的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 秒来完成其工作。

检查优化器的二进制安装

您可以将工厂设置为仅在系统上安装了二进制文件时才将优化器添加到链中。

use Spatie\ImageOptimizer\OptimizerChainFactory;

$config = [
    'checkBinaries' => true
];

$optimizerChain = OptimizerChainFactory::create($config);

创建自己的优化链

如果您想自定义优化器链,可以通过手动将 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 应使用的选项传递给其构造函数。

编写自定义优化器

想要使用另一个命令行工具来优化你的图片?没问题。只需编写你自己的优化器。优化器是任何实现了 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;

    /**
     * Get the temporary file's path.
     *
     * @return null|string
     */
    public function getTmpPath(): ?string;

    /**
     * Get the command that should return the installed binary version.
     *
     * @return string
     */
    public function getVersionCommand(): 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,via Unsplash

webp

Original 原始
461 KB

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

来源:Jeff Sheldon,via Unsplash

avif

Original 原始
725 KB

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

来源:Jeff Sheldon,via Unsplash

png

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

Original

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

Optimized

svg

原始:Illustrator | 优化过的 Web SVG 导出
25 KB

Original

优化
20 KB (-21.5%)

Optimized

更新日志

请查看更新日志以获取有关最近更改的更多信息。

测试

composer test

贡献

请参阅 CONTRIBUTING 以获取详细信息。

安全

如果您发现了关于安全性的错误,请发送邮件至 security@spatie.be 而不是使用问题追踪器。

Postcardware

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

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

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

致谢

本软件包受到了 psliwa/image-optimizer 的启发

Joke Forment 提供情感支持

许可协议

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