该包已被放弃且不再维护。未建议替代包。

使用 Laravel 轻松优化图像


README

🚨 此包已被放弃 🚨

我不再使用 Laravel,无法证明维护此包所需的时间。因此,我选择放弃它。欢迎您fork我的代码并维护自己的版本。

使用 Laravel 轻松优化图像

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

Lio 可以通过一系列图像优化工具优化 PNG、JPG、SVG 和 GIF。

此包主要基于 Spatie 的 spatie/image-optimizer 和 spatie/laravel-image-optimizer 包,可以像它们一样优化本地图像。此外,它还可以优化存储在 Laravel 文件系统磁盘上的图像。

以下是使用方法

use Bvtterfly\Lio\Facades\ImageOptimizer;
// The image from your configured filesystem disk will be downloaded, optimized, and uploaded to the output path in
ImageOptimizer::optimize($pathToImage, $pathToOptimizedImage);
// The local image will be replaced with an optimized version which should be smaller
ImageOptimizer::optimizeLocal($pathToImage);
// if you use a second parameter the package will not modify the original
ImageOptimizer::optimizeLocal($pathToImage, $pathToOptimizedImage);

如果您不喜欢门面,只需从容器中解析配置好的 Bvtterfly\Lio\OptimizerChain 实例即可

use Bvtterfly\Lio\OptimizerChain;
app(OptimizerChain::class)->optimize($pathToImage, $pathToOptimizedImage);

安装

您可以通过 composer 安装此包

composer require bvtterfly/lio

包将自动注册自己。

该包使用大量二进制文件来优化图像。有关安装这些二进制文件的信息,请参阅 图像优化工具 部分。

该包附带了一些合理的默认值以优化图像。您可以通过发布配置文件来修改该配置。

php artisan vendor:publish --tag="lio-config"

这是发布配置文件的内容

use Bvtterfly\Lio\Optimizers\Cwebp;
use Bvtterfly\Lio\Optimizers\Gifsicle;
use Bvtterfly\Lio\Optimizers\Jpegoptim;
use Bvtterfly\Lio\Optimizers\Optipng;
use Bvtterfly\Lio\Optimizers\Pngquant;
use Bvtterfly\Lio\Optimizers\ReSmushOptimizer;
use Bvtterfly\Lio\Optimizers\Svgo;
use Bvtterfly\Lio\Optimizers\Svgo2;

return [
    /*
     * If set to `default` it uses your default filesystem disk.
     * You can set it to any filesystem disks configured in your application.
     */
    'disk' => 'default',

    /*
     * If set to `true` all output of the optimizer binaries will be appended to the default log channel.
     * You can also set this to a class that implements `Psr\Log\LoggerInterface`
     * or any log channels you configured in your application.
     */
    'log_optimizer_activity' => false,

    /*
     * Optimizers are responsible for optimizing your image
     */
    'optimizers' => [
        Jpegoptim::class => [
            '--max=85',
            '--strip-all',
            '--all-progressive',
        ],
        Pngquant::class => [
            '--quality=85',
            '--force',
            '--skip-if-larger',
        ],
        Optipng::class => [
            '-i0',
            '-o2',
            '-quiet',
        ],
        Svgo2::class => [],
        Gifsicle::class => [
            '-b',
            '-O3',
        ],
        Cwebp::class => [
            '-m 6',
            '-pass 10',
            '-mt',
            '-q 80',
        ],
//        Svgo::class => [
//            '--disable={cleanupIDs,removeViewBox}',
//        ],
//        ReSmushOptimizer::class => [
//            'quality' => 92,
//            'retry' => 3,
//            'mime' => [
//                'image/png',
//                'image/jpeg',
//                'image/gif',
//                'image/bmp',
//                'image/tiff',
//            ],
//
//            'exif' => false,
//
//        ],
    ],

    /*
    * The maximum time in seconds each optimizer is allowed to run separately.
    */
    'timeout' => 60,

    /*
    * The directories where your binaries are stored.
    * Only use this when your binaries are not accessible in the global environment.
    */
    'binaries_path' => [
        'jpegoptim' => '',
        'optipng' => '',
        'pngquant' => '',
        'svgo' => '',
        'gifsicle' => '',
        'cwebp' => '',
    ],


    /*
    * The directory where the temporary files will be stored.
    */
    'temporary_directory' => storage_path('app/temp'),

];

命令行优化工具

如果您的系统上存在这些优化器,则将使用这些优化器

以下是 Ubuntu 上安装所有优化器的方法

sudo apt-get install jpegoptim
sudo apt-get install optipng
sudo apt-get install pngquant
sudo npm install -g svgo@2.8.x
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@2.8.x
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@2.8.x
sudo dnf install gifsicle
sudo dnf install libwebp-tools

如果您无法安装和使用上述优化器,您仍然可以使用 reSmush Optimizer 优化您的图像。

哪些工具会做什么?

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

JPG

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

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

PNG

通过运行两个工具可以使PNG文件变小。第一个工具是Pngquant 2,一个有损PNG压缩器。我们未设置额外选项,使用默认设置。之后,我们将图像通过第二个工具:Optipng。这些选项将被使用

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

SVGs

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

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

默认SVGO优化器(Svgo2)仅与SVGO 2.x兼容。对于自定义SVGO配置,您必须创建您的配置文件并将其路径传递给配置数组

Svgo2::class => [
    'path' => '/path/to/your/svgo/config.js'
]

如果您已安装SVGO 1.x且无法升级到2.x,您可以在配置文件中取消注释Svgo优化器

Svgo::class => [
    '--disable={cleanupIDs,removeViewBox}',
],
// Svgo2::class => [],

GIFs

GIFs将通过Gifsicle进行优化。这些选项将被使用

  • -O3:将优化级别设置为Gifsicle的最大值,这将产生最慢但最好的结果

WEBPs

WEBPs将通过Cwebp进行优化。这些选项将被使用

  • -m 6使用最慢的压缩方法以获得最佳的压缩效果。
  • -pass 10以最大化分析遍数。
  • -mt多线程以获得一些速度提升。
  • -q 90质量因子带来最不明显的变化。

(设置取自这里

设置二进制路径

如果您的二进制文件在全局环境中不可用,您可以通过在配置文件中使用binaries_path选项来设置它们。

reSmush优化器

当您无法安装命令行优化工具时,您可以在配置文件中取消注释它们以禁用它们,并取消注释reSumsh优化器以启用它。reSmush提供免费API以优化图像。但是,它只能优化PNG、JPG、GIF、BMP和TIF图像,最大5MB。

使用方法

您可以从容器中解析配置的Bvtterfly\Lio\OptimizerChain实例

use Bvtterfly\Lio\OptimizerChain;
app(OptimizerChain::class)->optimize($pathToImage, $pathToOptimizedImage);

或使用外观

use Bvtterfly\Lio\Facades\ImageOptimizer;
// The image from your configured filesystem disk will be downloaded, optimized, and uploaded to the output path in
ImageOptimizer::optimize($pathToImage, $pathToOptimizedImage);

如果您的文件是本地的,您可以使用optimizeLocal方法

use Bvtterfly\Lio\Facades\ImageOptimizer;
// The local image will be replaced with an optimized version which should be smaller
ImageOptimizer::optimizeLocal($pathToImage);
// if you use a second parameter the package will not modify the original
ImageOptimizer::optimizeLocal($pathToImage, $pathToOptimizedImage);

使用中间件

如果您希望自动优化路由请求中上传的所有图像,您可以使用OptimizeUploadedImages中间件。

Route::middleware(OptimizeUploadedImages::class)->group(function () {
    // all images will be optimized automatically
    Route::post('images', 'ImageController@store');
});

编写自定义优化器

您可能想编写自己的优化器,通过其他实用工具优化图像。优化器是实现Bvtterfly\Lio\Contracts\Optimizer接口的任何类

use Psr\Log\LoggerInterface;

interface Optimizer
{
    /**
     * Determines if the given image can be handled by the optimizer.
     *
     * @param Image $image
     *
     * @return bool
     */
    public function canHandle(Image $image): bool;

    /**
     * Sets the path to the image that should be optimized.
     *
     * @param string $imagePath
     *
     * @return Optimizer
     */
    public function setImagePath(string $imagePath): self;

    /**
     * Sets the logger for logging optimization process.
     *
     * @param  LoggerInterface  $logger
     *
     * @return Optimizer
     */
    public function setLogger(LoggerInterface $logger): self;

    /**
     * Sets the amount of seconds optimizer may use.
     *
     * @param  int  $timeout
     *
     * @return Optimizer
     */
    public function setTimeout(int $timeout): self;

    /**
     * Runs the optimizer.
     *
     * @return void
     */
    public function run(): void;
}

如果您想查看示例实现,请查看此包附带现有优化器。您可以在配置文件中的optimizers数组中添加您优化器的完全限定类名作为键。

测试

composer test

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

贡献

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

致谢

许可证

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