ddone/image-optimizer56

使用 PHP 轻松优化图像

57 2019-05-13 15:52 UTC

README

支持 PHP5.6

Latest Version on Packagist Build Status Quality Score StyleCI 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
sudo apt-get install gifsicle

以下是如何在 MacOS 上安装二进制文件的方法(使用 Homebrew

brew install jpegoptim
brew install optipng
brew install pngquant
brew install svgo
brew install gifsicle

哪些工具会做什么?

该软件包将自动决定针对特定图像使用哪些工具。

JPG

JPG 将通过 JpegOptim 进行缩小。以下选项将被使用

  • -m85:这将以 85% 的质量存储图像。此设置似乎符合 Google Pagespeed 压缩规则
  • --strip-all:这将删除所有文本信息,如注释和 EXIF 数据
  • --all-progressive:这将确保生成的图像是渐进式的,这意味着可以使用多次通过逐级提高的细节来下载。

PNG

PNG 将通过两个工具进行缩小。第一个是 Pngquant 2,一个有损 PNG 压缩程序。我们设置没有额外选项,使用默认值。之后,我们将图像通过第二个工具: Optipng。以下选项将被使用

  • -i0:这将生成一个非交织、渐进式扫描的图像
  • -o2:这将优化级别设置为 2(多次 IDAT 压缩尝试)

SVG

SVG 将通过 SVGO 进行压缩。将使用 SVGO 的默认配置,省略了 cleanupIDs 插件,因为已知该插件在单页上显示多个优化后的 SVG 时会引发问题。

请注意,SVGO 可能会破坏您的 svg。您可以在 Sara Soueidan 的这篇 优秀博客文章 中找到更多信息。

GIF

GIF 将通过 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中来实现。

以下是一个示例,其中我们只想使用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

更新日志

有关最近更改的更多信息,请参阅更新日志

测试

composer test

贡献

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

安全性

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

明信片软件

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

我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。

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

鸣谢

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

来自Joke Forment的情感支持。

支持我们

Spatie是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述:点击这里

您的业务是否依赖于我们的贡献?请通过Patreon联系我们并支持我们。所有的承诺都将专门用于分配人力进行维护和开发新的精彩内容。

许可证

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