Dieses Paket kann PNGs, JPGs, WEBPs, AVIFs, SVGs und GIFs optimieren, indem es sie durch eine Kette verschiedener Bildoptimierungstools laufen lässt. So können Sie es verwenden:
use SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
Das Bild bei $pathToImage
wird durch eine optimierte Version überschrieben, die kleiner sein sollte. Das Paket erkennt automatisch, welche Optimierungsbinärdateien auf Ihrem System installiert sind und verwendet diese.
Hier sind einige Beispielkonvertierungen, die von diesem Paket durchgeführt wurden.
Du liebst Laravel? Dann gehen Sie zur Laravel-spezifischen Integration.
Benutzen Sie WordPress? Dann probieren Sie den WP CLI-Befehl aus.
SilverStripe-Enthusiast? Verschwenden Sie keine Zeit, gehen Sie zum SilverStripe-Modul.
Wir investieren viele Ressourcen in die Erstellung erstklassiger Open-Source-Pakete. Sie können uns unterstützen, indem Sie eines unserer kostenpflichtigen Produkte kaufen.
Wir freuen uns sehr, dass Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden. Unsere Adresse finden Sie auf unserer Kontaktseite. Wir veröffentlichen alle erhaltenen Postkarten auf unserer virtuellen Postkartenwand.
Sie können das Paket über Composer installieren:
Komponist benötigt Spatie/Bildoptimierer
Das Paket verwendet diese Optimierer, sofern sie auf Ihrem System vorhanden sind:
JpegOptim
Optimierung
Pngquant 2
SVGO 1
GIFsicle
cwebp
Avifenc
So installieren Sie alle Optimierer unter Ubuntu/Debian:
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 sudo apt-get install webp sudo apt-get install libavif-bin # mindestens 0.9.3
Und so installieren Sie die Binärdateien unter MacOS (mit Homebrew):
brew installiere jpegoptim brew install optpng brew installiere pngquant npm install -g svgo brew install gifsicle brew installiere webp brew installiere libavif
Und so installieren Sie die Binärdateien auf Fedora/RHEL/CentOS:
sudo dnf installiere epel-release sudo dnf installiere jpegoptim sudo dnf install optipng sudo dnf installiere pngquant sudo npm install -g svgo sudo dnf install gifsicle sudo dnf installiere libwebp-tools sudo dnf installiere libavif-tools
Das Paket entscheidet automatisch, welche Tools für ein bestimmtes Bild verwendet werden sollen.
JPGs werden verkleinert, indem sie über JpegOptim ausgeführt werden. Diese Optionen werden verwendet:
-m85
: Dadurch wird das Bild mit 85 % Qualität gespeichert. Diese Einstellung scheint den Pagespeed-Komprimierungsregeln von Google zu entsprechen
--strip-all
: Dadurch werden alle Textinformationen wie Kommentare und EXIF-Daten entfernt
--all-progressive
: Dadurch wird sichergestellt, dass das resultierende Bild progressiv ist, was bedeutet, dass es in mehreren Durchgängen mit zunehmend höheren Details heruntergeladen werden kann.
PNGs werden verkleinert, indem sie durch zwei Tools ausgeführt werden. Der erste ist Pngquant 2, ein verlustbehafteter PNG-Kompressor. Wir legen keine zusätzlichen Optionen fest, es werden deren Standardwerte verwendet. Danach lassen wir das Bild durch ein zweites laufen: Optipng. Diese Optionen werden verwendet:
-i0
: Dies führt zu einem nicht interlaced, progressiv gescannten Bild
-o2
: Dadurch wird die Optimierungsstufe auf zwei gesetzt (mehrere IDAT-Komprimierungsversuche).
SVGs werden von SVGO minimiert. Es wird die Standardkonfiguration von SVGO verwendet, wobei die Plugins cleanupIDs
und removeViewBox
weggelassen werden, da diese bekanntermaßen Probleme verursachen, wenn mehrere optimierte SVGs auf einer Seite angezeigt werden.
Bitte beachten Sie, dass SVGO Ihr SVG beschädigen kann. Weitere Informationen dazu finden Sie in diesem hervorragenden Blogbeitrag von Sara Soueidan.
GIFs werden von Gifsicle optimiert. Diese Optionen werden verwendet:
-O3
: Dies setzt die Optimierungsstufe auf das Maximum von Gifsicle, was die langsamsten, aber besten Ergebnisse liefert
WEBPs werden von Cwebp optimiert. Diese Optionen werden verwendet:
-m 6
für die langsamste Komprimierungsmethode, um die beste Komprimierung zu erhalten.
-pass 10
zur Maximierung der Anzahl der Analysedurchgänge.
-mt
Multithreading für einige Geschwindigkeitsverbesserungen.
-q 90
Qualitätsfaktor, der die am wenigsten spürbaren Änderungen mit sich bringt.
(Die Originaleinstellungen stammen von hier)
AVIFs werden von Avifenc optimiert. Diese Optionen werden verwendet:
-a cq-level=23
: Konstante Qualitätsstufe. Niedrigere Werte bedeuten eine bessere Qualität und eine größere Dateigröße (0-63).
-j all
: Anzahl der Jobs (Worker-Threads, all
nutzen alle verfügbaren Kerne).
--min 0
: Min. Quantisierer für Farbe (0-63).
--max 63
: Maximaler Quantisierer für Farbe (0-63).
--minalpha 0
: Minimaler Quantisierer für Alpha (0-63).
--maxalpha 63
: Maximaler Quantisierer für Alpha (0-63).
-a end-usage=q
Der Ratensteuerungsmodus ist auf den Modus „Konstante Qualität“ eingestellt.
-a tune=ssim
: SSIM, um den Encoder auf Verzerrungsmetrik abzustimmen.
(Die Originaleinstellungen stammen von hier und hier)
Dies ist die Standardmethode zur Verwendung des Pakets:
use SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
Das Bild bei $pathToImage
wird durch eine optimierte Version überschrieben, die kleiner sein sollte.
Das Paket erkennt automatisch, welche Optimierungsbinärdateien auf Ihrem System installiert sind und verwendet diese.
Um das Originalbild beizubehalten, können Sie ein zweites optimize
übergeben:
use SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage, $pathToOutput);
In diesem Beispiel berührt das Paket $pathToImage
nicht und schreibt keine optimierte Version in $pathToOutput
.
Sie können die maximale Zeit in Sekunden festlegen, die jeder einzelne Optimierer in einer Kette verwenden kann, indem Sie setTimeout
aufrufen:
$optimizerChain->setTimeout(10) ->optimize($pathToImage);
In diesem Beispiel hat jeder Optimierer in der Kette maximal 10 Sekunden Zeit, um seine Aufgabe zu erledigen.
Wenn Sie die Kette der Optimierer anpassen möchten, können Sie dies tun, indem Sie Optimizer
manuell zu einer OptimizerChain
hinzufügen.
Hier ist ein Beispiel, bei dem nur optipng
und jpegoptim
verwendet werden sollen:
use SpatieImageOptimizerOptimizerChain;use SpatieImageOptimizerOptimizersJpegoptim;use SpatieImageOptimizerOptimizersPngquant;$optimizerChain = (new OptimizerChain) ->addOptimizer(new Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(new Pngquant([ '--force', ]))
Beachten Sie, dass Sie die Optionen, die ein Optimizer
verwenden soll, an seinen Konstruktor übergeben können.
Möchten Sie ein anderes Befehlszeilenprogramm verwenden, um Ihre Bilder zu optimieren? Kein Problem. Schreiben Sie einfach Ihren eigenen Optimierer. Ein Optimierer ist jede Klasse, die die SpatieImageOptimizerOptimizersOptimizer
-Schnittstelle implementiert:
Namespace SpatieImageOptimizerOptimizers; SpatieImageOptimizerImage verwenden; Interface Optimizer {/** * Gibt den Namen der auszuführenden Binärdatei zurück. * * @return string */public function binaryName(): string;/** * Bestimmt, ob das angegebene Bild vom Optimierer verarbeitet werden kann. * * @param SpatieImageOptimizerImage $image * * @return bool */public function canHandle(Image $image): bool;/** * Legen Sie den Pfad zum Bild fest, das optimiert werden soll. * * @param string $imagePath * * @return $this */public function setImagePath(string $imagePath);/** * Legen Sie die Optionen fest, die der Optimierer verwenden soll. * * @param array $options * * @return $this */public function setOptions(array $options = []);/** * Ruft den Befehl ab, der ausgeführt werden soll. * * @return string */public function getCommand(): string; }
Wenn Sie eine Beispielimplementierung ansehen möchten, werfen Sie einen Blick auf die vorhandenen Optimierer, die mit diesem Paket geliefert werden.
Sie können Ihren Optimierer ganz einfach hinzufügen, indem Sie die Methode addOptimizer
auf einer OptimizerChain
verwenden.
verwenden Sie SpatieImageOptimizerImageOptimizerFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->addOptimizer(new YourCustomOptimizer()) ->optimize($pathToImage);
Standardmäßig gibt das Paket keine Fehler aus und arbeitet einfach im Hintergrund. Um zu überprüfen, was das Paket tut, können Sie einen Logger festlegen:
verwenden Sie SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->useLogger(new MyLogger()) ->optimize($pathToImage);
Ein Logger ist eine Klasse, die PsrLogLoggerInterface
implementiert. Eine gute Protokollierungsbibliothek, die vollständig konform ist, ist Monolog. Das Paket schreibt in das Protokoll, welche Optimizers
verwendet werden, welche Befehle ausgeführt werden und welche Ausgabe sie ausgeben.
Hier sind einige reale Beispielkonvertierungen, die mit diesem Paket durchgeführt wurden.
Methodik für JPG-, WEBP- und AVIF-Bilder: Das Originalbild wurde in spatie/image eingespeist (unter Verwendung des Standard-GD-Treibers) und auf eine Breite von 2048 Pixel geändert:
SpatieImageImage::load('original.jpg') ->Breite (2048) ->save('image.jpg'); // image.png, image.webp, image.avif
Original
771 KB
Optimiert
511 KB (-33,7 %, DSSIM: 0,00052061)
Credits: Jeff Sheldon, über Unsplash
Original
461 KB
Optimiert
184 KB (-60,0 %, DSSIM: 0,00166036)
Credits: Jeff Sheldon, über Unsplash
Original
725 KB
Optimiert
194 KB (-73,2 %, DSSIM: 0,00163751)
Credits: Jeff Sheldon, über Unsplash
Original: Photoshop „Für Web speichern“ | PNG-24 mit Transparenz
39 KB
Optimiert
16 KB (-59 %, DSSIM: 0,00000251)
Original: Illustrator | Weboptimierter SVG-Export
25 KB
Optimiert
20 KB (-21,5 %)
Weitere Informationen zu den letzten Änderungen finden Sie im CHANGELOG.
Komponistentest
Weitere Informationen finden Sie unter BEITRAGEN.
Wenn Sie einen Sicherheitsfehler gefunden haben, senden Sie bitte eine E-Mail an [email protected], anstatt den Issue-Tracker zu verwenden.
Es steht Ihnen frei, dieses Paket zu verwenden (es ist MIT-lizenziert), aber wenn es in Ihre Produktionsumgebung gelangt, würden wir uns sehr freuen, wenn Sie uns eine Postkarte aus Ihrer Heimatstadt schicken und erwähnen, welches unserer Pakete Sie verwenden.
Unsere Adresse lautet: Spatie, Kruikstraat 22, 2018 Antwerpen, Belgien.
Wir veröffentlichen alle erhaltenen Postkarten auf unserer Firmenwebsite.
Freek Van der Herten
Alle Mitwirkenden
Dieses Paket wurde von psliwa/image-optimizer inspiriert
Emotionale Unterstützung durch Joke Formment
Die MIT-Lizenz (MIT). Weitere Informationen finden Sie in der Lizenzdatei.