Ce package peut optimiser les PNG, JPG, WEBP, AVIF, SVG et GIF en les exécutant via une chaîne de divers outils d'optimisation d'image. Voici comment vous pouvez l'utiliser :
utilisez SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
L'image de $pathToImage
sera écrasée par une version optimisée qui devrait être plus petite. Le package détectera automatiquement quels binaires d'optimisation sont installés sur votre système et les utilisera.
Voici quelques exemples de conversions effectuées par ce package.
Vous aimez Laravel ? Rendez-vous ensuite sur l'intégration spécifique à Laravel.
Vous utilisez WordPress ? Essayez ensuite la commande WP CLI.
Passionné de SilverStripe ? Ne perdez pas de temps, rendez-vous dans le module SilverStripe.
Nous investissons beaucoup de ressources dans la création des meilleurs packages open source de leur catégorie. Vous pouvez nous soutenir en achetant l'un de nos produits payants.
Nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant le(s) forfait(s) que vous utilisez. Vous trouverez notre adresse sur notre page contact. Nous publions toutes les cartes postales reçues sur notre mur virtuel de cartes postales.
Vous pouvez installer le package via composer :
le compositeur nécessite spatie/image-optimizer
Le package utilisera ces optimiseurs s'ils sont présents sur votre système :
JpegOptim
Optation
pngquant 2
SVGO1
Gifsicle
cwebp
avifenc
Voici comment installer tous les optimiseurs sur 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 libaviv-bin # minimum 0.9.3
Et voici comment installer les binaires sur MacOS (en utilisant Homebrew) :
Brew installer jpegoptim optimisation de l'installation de Brew infuser installer pngquant npm install -g svgo Brew installer gifsicle Brew installer WebP Brew installer Libavif
Et voici comment installer les binaires sur Fedora/RHEL/CentOS :
sudo dnf install epel-release sudo dnf installer jpegoptim sudo dnf install optipng sudo dnf installer pngquant sudo npm install -g svgo sudo dnf installer gifsicle sudo dnf installer libwebp-tools sudo dnf installer libaviv-tools
Le package décidera automatiquement quels outils utiliser sur une image particulière.
Les JPG seront réduits en les exécutant via JpegOptim. Ces options sont utilisées :
-m85
: cela stockera l'image avec une qualité de 85%. Ce paramètre semble satisfaire aux règles de compression Pagespeed de Google
--strip-all
: cela supprime toutes les informations textuelles telles que les commentaires et les données EXIF
--all-progressive
: cela garantira que l'image résultante est progressive, ce qui signifie qu'elle peut être téléchargée en utilisant plusieurs passes de détails de plus en plus élevés.
Les PNG seront réduits en les exécutant via deux outils. Le premier est Pngquant 2, un compresseur PNG avec perte. Nous ne définissons aucune option supplémentaire, leurs valeurs par défaut sont utilisées. Après cela, nous passons l'image via une deuxième : Optipng. Ces options sont utilisées :
-i0
: cela donnera une image numérisée progressive et non entrelacée
-o2
: cela définit le niveau d'optimisation à deux (plusieurs essais de compression IDAT)
Les SVG seront minifiés par SVGO. La configuration par défaut de SVGO sera utilisée, avec l'omission des plugins cleanupIDs
et removeViewBox
car ceux-ci sont connus pour causer des problèmes lors de l'affichage de plusieurs SVG optimisés sur une seule page.
Veuillez noter que SVGO peut casser votre svg. Vous trouverez plus d'informations à ce sujet dans cet excellent article de Sara Soueidan.
Les GIF seront optimisés par Gifsicle. Ces options seront utilisées :
-O3
: cela définit le niveau d'optimisation au maximum de Gifsicle, ce qui produit les résultats les plus lents mais les meilleurs
Les WEBP seront optimisés par Cwebp. Ces options seront utilisées :
-m 6
pour la méthode de compression la plus lente afin d'obtenir la meilleure compression.
-pass 10
pour maximiser la quantité de passes d'analyse.
-mt
multithreading pour certaines améliorations de vitesse.
-q 90
Facteur de qualité qui apporte les changements les moins visibles.
(Les paramètres sont originaux tirés d'ici)
Les AVIF seront optimisés par avifenc. Ces options seront utilisées :
-a cq-level=23
: Niveau de qualité constant. Des valeurs plus faibles signifient une meilleure qualité et une plus grande taille de fichier (0-63).
-j all
: Nombre de tâches (threads de travail, all
utilise tous les cœurs disponibles).
--min 0
: Quantificateur min pour la couleur (0-63).
--max 63
: Quantificateur maximum pour la couleur (0-63).
--minalpha 0
: Quantificateur minimum pour alpha (0-63).
--maxalpha 63
: Quantificateur maximum pour alpha (0-63).
-a end-usage=q
Mode de contrôle du débit défini sur le mode Qualité constante.
-a tune=ssim
: SSIM pour régler l'encodeur pour la métrique de distorsion.
(Les paramètres sont originaux tirés d'ici et ici)
Voici la manière par défaut d'utiliser le package :
utilisez SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
L'image de $pathToImage
sera écrasée par une version optimisée qui devrait être plus petite.
Le package détectera automatiquement quels binaires d'optimisation sont installés sur votre système et les utilisera.
Pour conserver l'image d'origine, vous pouvez passer par un deuxième argument optimize
:
utilisez SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage, $pathToOutput);
Dans cet exemple, le package ne touchera pas $pathToImage
et n'écrira pas une version optimisée dans $pathToOutput
.
Vous pouvez définir la durée maximale en secondes que chaque optimiseur individuel d'une chaîne peut utiliser en appelant setTimeout
:
$optimizerChain->setTimeout(10) ->optimiser ($pathToImage);
Dans cet exemple, chaque optimiseur de la chaîne disposera d'un maximum de 10 secondes pour faire son travail.
Si vous souhaitez personnaliser la chaîne d'optimiseurs, vous pouvez le faire en ajoutant manuellement Optimizer
à un OptimizerChain
.
Voici un exemple où nous souhaitons uniquement utiliser optipng
et jpegoptim
:
utiliser SpatieImageOptimizerOptimizerChain;utiliser SpatieImageOptimizerOptimizersJpegoptim;utiliser SpatieImageOptimizerOptimizersPngquant;$optimizerChain = (nouveau OptimizerChain) ->addOptimizer(nouveau Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(nouveau Pngquant([ '--force', ]))
Notez que vous pouvez transmettre les options qu'un Optimizer
doit utiliser à son constructeur.
Vous souhaitez utiliser un autre utilitaire de ligne de commande pour optimiser vos images ? Aucun problème. Écrivez simplement votre propre optimiseur. Un optimiseur est toute classe qui implémente l'interface SpatieImageOptimizerOptimizersOptimizer
:
espace de noms SpatieImageOptimizerOptimizers;utiliser SpatieImageOptimizerImage;interface Optimizer {/** * Renvoie le nom du binaire à exécuter. * * @return string */public function internalName(): string;/** * Détermine si l'image donnée peut être gérée par l'optimiseur. * * @param SpatieImageOptimizerImage $image * * @return bool */public function canHandle(Image $image): bool;/** * Définissez le chemin d'accès à l'image qui doit être optimisée. * * @param string $imagePath * * @return $this */public function setImagePath(string $imagePath);/** * Définissez les options que l'optimiseur doit utiliser. * * @param array $options * * @return $this */public function setOptions(array $options = []);/** * Récupère la commande qui doit être exécutée. * * @return string */public function getCommand(): string; }
Si vous souhaitez voir un exemple d'implémentation, jetez un œil aux optimiseurs existants livrés avec ce package.
Vous pouvez facilement ajouter votre optimiseur en utilisant la méthode addOptimizer
sur un OptimizerChain
.
utilisez SpatieImageOptimizerImageOptimizerFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->addOptimizer (nouveau YourCustomOptimizer()) ->optimiser ($pathToImage);
Par défaut, le package ne générera aucune erreur et fonctionnera simplement en silence. Pour vérifier ce que fait le package, vous pouvez définir un enregistreur :
utilisez SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->useLogger (nouveau MyLogger()) ->optimiser ($pathToImage);
Un logger est une classe qui implémente PsrLogLoggerInterface
. Une bonne bibliothèque de journalisation entièrement conforme est Monolog. Le package écrira dans le journal quels Optimizers
sont utilisés, quelles commandes sont exécutées et leur sortie.
Voici quelques exemples réels de conversions effectuées par ce package.
Méthodologie pour les images JPG, WEBP, AVIF : l'image originale a été introduite dans spatie/image (en utilisant le pilote GD par défaut) et redimensionnée à une largeur de 2048 px :
SpatieImageImage::load('original.jpg') ->largeur(2048) ->save('image.jpg'); // image.png, image.webp, image.avif
Original
771 Ko
Optimisé
511 Ko (-33,7%, DSSIM : 0,00052061)
crédits : Jeff Sheldon, via Unsplash
Original
461 Ko
Optimisé
184 Ko (-60,0%, DSSIM : 0,00166036)
crédits : Jeff Sheldon, via Unsplash
Original
725 Ko
Optimisé
194 Ko (-73,2%, DSSIM : 0,00163751)
crédits : Jeff Sheldon, via Unsplash
Original : Photoshop « Enregistrer pour le Web » | PNG-24 avec transparence
39 Ko
Optimisé
16 Ko (-59%, DSSIM : 0.00000251)
Traduction: Illustrateur | Exportation SVG optimisée pour le Web
25 Ko
Optimisé
20 Ko (-21,5%)
Veuillez consulter CHANGELOG pour plus d'informations sur ce qui a changé récemment.
test de compositeur
Veuillez consulter CONTRIBUER pour plus de détails.
Si vous avez trouvé un bug concernant la sécurité, veuillez envoyer un mail à [email protected] au lieu d'utiliser le suivi des problèmes.
Vous êtes libre d'utiliser ce package (il est sous licence MIT), mais s'il parvient à votre environnement de production, nous apprécions grandement que vous nous envoyiez une carte postale de votre ville natale, mentionnant lequel de nos packages vous utilisez.
Notre adresse est : Spatie, Kruikstraat 22, 2018 Anvers, Belgique.
Nous publions toutes les cartes postales reçues sur le site Internet de notre entreprise.
Freek Van der Herten
Tous les contributeurs
Ce package a été inspiré par psliwa/image-optimizer
Soutien émotionnel assuré par Joke Forment
La licence MIT (MIT). Veuillez consulter le fichier de licence pour plus d'informations.