juzaweb/image-optimizer

使用PHP轻松优化图像

1.4.1 2021-09-30 07:30 UTC

README

Latest Version on Packagist Tests Total Downloads

此包可以通过一系列各种图像优化工具来优化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中来做到这一点。

以下是一个例子,我们只想使用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;
}

如果您想查看示例实现,请查看此包中随附的现有优化器

您可以通过在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

Original

优化后
16 KB (40%)

Optimized

jpg

原始:Photoshop '保存为网页' | 优化,质量60
547 KB

Original

优化后
525 KB (95%)

Optimized

致谢:Jeff Sheldon,via Unsplash

svg

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

Original

优化后
20 KB (76%)

Optimized

webp

原始:WebPonize
528 KB

Original

优化后
328 KB (89%)

Optimized

致谢:Jeff Sheldon,via Unsplash

更新日志

请查看 CHANGELOG 获取最近更改的更多信息。

测试

composer test

贡献

请查看 CONTRIBUTING 获取详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。

明信片软件

您可以使用此包(它是 MIT-授权的),但如果它进入了您的生产环境,我们非常感激您寄给我们一张来自家乡的明信片,说明您正在使用我们哪个包。

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

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

致谢

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

Joke Forment 提供“情感支持”

许可证

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