bvtterfly / lio
使用 Laravel 轻松优化图像
Requires
- php: ^8.0
- ext-fileinfo: *
- guzzlehttp/guzzle: ^7.4
- illuminate/contracts: ^9.0
- spatie/laravel-package-tools: ^1.9.2
- spatie/temporary-directory: ^2.0
Requires (Dev)
- nunomaduro/collision: ^6.0
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^7.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.5
- spatie/laravel-ray: ^1.26
- dev-main
- 2.0.1
- 2.0.0
- 1.0.0
- 0.2.1
- 0.2.0
- 0.1.1
- 0.1.0
- dev-dependabot/github_actions/aglipanci/laravel-pint-action-2.3.1
- dev-dependabot/github_actions/actions/setup-node-4
- dev-dependabot/github_actions/stefanzweifel/git-auto-commit-action-5
- dev-dependabot/github_actions/actions/checkout-4
- dev-dependabot/github_actions/ramsey/composer-install-2
This package is auto-updated.
Last update: 2024-03-05 14:43:25 UTC
README
🚨 此包已被放弃 🚨
我不再使用 Laravel,无法证明维护此包所需的时间。因此,我选择放弃它。欢迎您fork我的代码并维护自己的版本。
使用 Laravel 轻松优化图像
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)。有关更多信息,请参阅许可证文件。