Optimize images in your Laravel app
, (*1)
This package is the Laravel 6.0 and up specific integration of spatie/image-optimizer. It can optimize PNGs, JPGs, SVGs and GIFs by running them through a chain of various image optimization tools. The package will automatically detect which optimization binaries are installed on your system and use them., (*2)
Here's how you can use it:, (*3)
use ImageOptimizer;
// the image will be replaced with an optimized version which should be smaller
ImageOptimizer::optimize($pathToImage);
// if you use a second parameter the package will not modify the original
ImageOptimizer::optimize($pathToImage, $pathToOptimizedImage);
You don't like facades you say? No problem! Just resolve a configured instance of Spatie\ImageOptimizer\OptimizerChain
out of the container:, (*4)
app(Spatie\ImageOptimizer\OptimizerChain::class)->optimize($pathToImage);
The package also contains a middleware to automatically optimize all images in an request., (*5)
Don't use Laravel you say? No problem! Just use the underlying spatie/image-optimizer directly., (*6)
Support us
, (*7)
We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products., (*8)
We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall., (*9)
Installation
You can install the package via composer:, (*10)
composer require spatie/laravel-image-optimizer
The package will automatically register itself., (*11)
The package uses a bunch of binaries to optimize images. To learn which ones on how to install them, head over to the optimization tools section in the readme of the underlying image-optimizer package. That readme also contains info on what these tools will do to your images., (*12)
The package comes with some sane defaults to optimize images. You can modify that configuration by publishing the config file., (*13)
php artisan vendor:publish --provider="Spatie\LaravelImageOptimizer\ImageOptimizerServiceProvider"
This is the contents of the config/image-optimizer
file that will be published:, (*14)
use Spatie\ImageOptimizer\Optimizers\Svgo;
use Spatie\ImageOptimizer\Optimizers\Optipng;
use Spatie\ImageOptimizer\Optimizers\Gifsicle;
use Spatie\ImageOptimizer\Optimizers\Pngquant;
use Spatie\ImageOptimizer\Optimizers\Jpegoptim;
use Spatie\ImageOptimizer\Optimizers\Cwebp;
return [
/**
* When calling `optimize` the package will automatically determine which optimizers
* should run for the given image.
*/
'optimizers' => [
Jpegoptim::class => [
'-m85', // set maximum quality to 85%
'--strip-all', // this strips out all text information such as comments and EXIF data
'--all-progressive' // this will make sure the resulting image is a progressive one
],
Pngquant::class => [
'--force' // required parameter for this package
],
Optipng::class => [
'-i0', // this will result in a non-interlaced, progressive scanned image
'-o2', // this set the optimization level to two (multiple IDAT compression trials)
'-quiet' // required parameter for this package
],
Svgo::class => [
'--disable=cleanupIDs' // disabling because it is known to cause trouble
],
Gifsicle::class => [
'-b', // required parameter for this package
'-O3' // this produces the slowest but best results
],
Cwebp::class => [
'-m 6', // for the slowest compression method in order to get the best compression.
'-pass 10', // for maximizing the amount of analysis pass.
'-mt', // multithreading for some speed improvements.
'-q 90', //quality factor that brings the least noticeable changes.
],
],
/**
* The maximum time in seconds each optimizer is allowed to run separately.
*/
'timeout' => 60,
/**
* If set to `true` all output of the optimizer binaries will be appended to the default log.
* You can also set this to a class that implements `Psr\Log\LoggerInterface`.
*/
'log_optimizer_activity' => false,
];
If you want to automatically optimize images that get uploaded to your application add the \Spatie\LaravelImageOptimizer\Middlewares\OptimizeImages::class
in the http kernel., (*15)
// app/Http/Kernel.php
protected $middlewareAliases = [
...
'optimizeImages' => \Spatie\LaravelImageOptimizer\Middlewares\OptimizeImages::class,
];
Usage
You can resolve a configured instance of Spatie\ImageOptimizer\OptimizerChain
out of the container:, (*16)
// the image will be replaced with an optimized version which should be smaller
app(Spatie\ImageOptimizer\OptimizerChain::class)->optimize($pathToImage);
// if you use a second parameter the package will not modify the original
app(Spatie\ImageOptimizer\OptimizerChain::class)->optimize($pathToImage, $pathToOptimizedImage);
Using the facade
use ImageOptimizer;
// the image will be replaced with an optimized version which should be smaller
ImageOptimizer::optimize($pathToImage);
// if you use a second parameter the package will not modify the original
ImageOptimizer::optimize($pathToImage, $pathToOptimizedImage);
You don't like facades you say? No problem! Just resolve a configured instance of Spatie\ImageOptimizer\OptimizerChain
out of the container:, (*17)
app(Spatie\ImageOptimizer\OptimizerChain::class)->optimize($pathToImage);
Using the middleware
All images that in requests to routes that use the optimizeImages
-middleware will be optimized automatically., (*18)
Route::middleware('optimizeImages')->group(function () {
// all images will be optimized automatically
Route::post('upload-images', 'UploadController@index');
});
Adding your own optimizers
To learn how to create your own optimizer read the "Writing custom optimizers" section in the readme of the underlying spatie/image-optimizer package., (*19)
You can add the fully qualified classname of your optimizer as a key in the optimizers
array in the config file., (*20)
Example conversions
Here are some example conversions that were made by the optimizer., (*21)
Changelog
Please see CHANGELOG for more information what has changed recently., (*22)
Testing
bash
composer test
, (*23)
Contributing
Please see CONTRIBUTING for details., (*24)
Security
If you've found a bug regarding security please mail security@spatie.be instead of using the issue tracker., (*25)
Postcardware
You're free to use this package (it's MIT-licensed), but if it makes it to your production environment we highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using., (*26)
Our address is: Spatie, Kruikstraat 22, 2018 Antwerp, Belgium., (*27)
We publish all received postcards on our company website., (*28)
Credits
The idea of a middleware that optimizes all files in a request is taken from approached/laravel-image-optimizer., (*29)
License
The MIT License (MIT). Please see License File for more information., (*30)