Este paquete puede optimizar archivos PNG, JPG, WEBP, AVIF, SVG y GIF ejecutándolos a través de una cadena de varias herramientas de optimización de imágenes. Así es como puedes usarlo:
utilice SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
La imagen en $pathToImage
será sobrescrita por una versión optimizada que debería ser más pequeña. El paquete detectará automáticamente qué archivos binarios de optimización están instalados en su sistema y los utilizará.
A continuación se muestran algunos ejemplos de conversiones realizadas por este paquete.
¿Te encanta Laravel? Luego dirígete a la integración específica de Laravel.
¿Usas WordPress? Luego pruebe el comando WP CLI.
¿Entusiasta de SilverStripe? No pierdas tiempo, ve al módulo SilverStripe.
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Apreciamos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Puede instalar el paquete a través del compositor:
El compositor requiere espacio/optimizador de imágenes.
El paquete utilizará estos optimizadores si están presentes en su sistema:
JpegOptim
Opción
Pngcuanto 2
SVGO 1
gifsicle
cwebp
avifenc
Aquí se explica cómo instalar todos los optimizadores en Ubuntu/Debian:
sudo apt-get instalar jpegoptim sudo apt-get install optipng sudo apt-get install pngquant sudo npm instalar -g svgo sudo apt-get install gifsicle sudo apt-get instalar webp sudo apt-get install libavif-bin # mínimo 0.9.3
Y aquí se explica cómo instalar los binarios en MacOS (usando Homebrew):
instalar cerveza jpegoptim opción de instalación de cerveza instalación de cerveza pngquant instalación npm -g svgo Gifsicle de instalación de cerveza instalar cerveza webp instalar cerveza libavif
Y aquí se explica cómo instalar los binarios en Fedora/RHEL/CentOS:
sudo dnf instalar epel-liberación sudo dnf instalar jpegoptim opción de instalación sudo dnf sudo dnf instalar pngquant sudo npm instalar -g svgo sudo dnf instalar gifsicle sudo dnf instalar herramientas libwebp sudo dnf instalar herramientas libavif
El paquete decidirá automáticamente qué herramientas utilizar en una imagen en particular.
Los JPG se harán más pequeños ejecutándolos a través de JpegOptim. Se utilizan estas opciones:
-m85
: esto almacenará la imagen con un 85% de calidad. Esta configuración parece satisfacer las reglas de compresión Pagespeed de Google.
--strip-all
: esto elimina toda la información del texto, como comentarios y datos EXIF.
--all-progressive
: esto asegurará que la imagen resultante sea progresiva, lo que significa que se puede descargar usando múltiples pases de detalles progresivamente más altos.
Los PNG se harán más pequeños ejecutándolos a través de dos herramientas. El primero es Pngquant 2, un compresor PNG con pérdidas. No configuramos opciones adicionales, se utilizan sus valores predeterminados. Después de eso pasamos la imagen por una segunda: Optipng. Se utilizan estas opciones:
-i0
: esto dará como resultado una imagen escaneada progresiva y no entrelazada
-o2
: esto establece el nivel de optimización en dos (múltiples pruebas de compresión IDAT)
SVGO minimizará los SVG. Se utilizará la configuración predeterminada de SVGO, con la omisión de los complementos cleanupIDs
y removeViewBox
porque se sabe que causan problemas al mostrar múltiples SVG optimizados en una página.
Tenga en cuenta que SVGO puede dañar su svg. Encontrarás más información sobre esto en esta excelente publicación de blog de Sara Soueidan.
Los GIF serán optimizados por Gifsicle. Se utilizarán estas opciones:
-O3
: esto establece el nivel de optimización al máximo de Gifsicle, lo que produce los resultados más lentos pero mejores.
Los WEBP serán optimizados por Cwebp. Se utilizarán estas opciones:
-m 6
para el método de compresión más lento para obtener la mejor compresión.
-pass 10
para maximizar la cantidad de pase de análisis.
-mt
multiproceso para algunas mejoras de velocidad.
-q 90
Factor de calidad que trae los cambios menos perceptibles.
(Las configuraciones son originales tomadas de aquí)
Los AVIF serán optimizados por avifenc. Se utilizarán estas opciones:
-a cq-level=23
: Nivel de calidad constante. Los valores más bajos significan mejor calidad y mayor tamaño de archivo (0-63).
-j all
: número de trabajos (subprocesos de trabajo, all
utilizan todos los núcleos disponibles).
--min 0
: Cuantizador mínimo para color (0-63).
--max 63
: Cuantizador máximo para color (0-63).
--minalpha 0
: Cuantizador mínimo para alfa (0-63).
--maxalpha 63
: Cuantizador máximo para alfa (0-63).
-a end-usage=q
Modo de control de tasa establecido en modo de calidad constante.
-a tune=ssim
: SSIM ajusta el codificador para la métrica de distorsión.
(Las configuraciones son originales tomadas de aquí y aquí)
Esta es la forma predeterminada de utilizar el paquete:
utilice SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
La imagen en $pathToImage
será sobrescrita por una versión optimizada que debería ser más pequeña.
El paquete detectará automáticamente qué archivos binarios de optimización están instalados en su sistema y los utilizará.
Para mantener la imagen original, puede pasar por un segundo argumento optimize
:
utilice SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage, $pathToOutput);
En ese ejemplo, el paquete no tocará $pathToImage
y escribirá una versión optimizada en $pathToOutput
.
Puedes establecer el tiempo máximo en segundos que cada optimizador individual en una cadena puede usar llamando setTimeout
:
$optimizerChain->setTimeout(10) ->optimizar($pathToImage);
En este ejemplo, cada optimizador de la cadena tendrá un máximo de 10 segundos para hacer su trabajo.
Si desea personalizar la cadena de optimizadores, puede hacerlo agregando Optimizer
manualmente a OptimizerChain
.
A continuación se muestra un ejemplo en el que solo queremos que se utilicen optipng
y jpegoptim
:
use SpatieImageOptimizerOptimizerChain;use SpatieImageOptimizerOptimizersJpegoptim;use SpatieImageOptimizerOptimizersPngquant;$optimizerChain = (nueva OptimizerChain) ->addOptimizer(new Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(nuevo Pngquant([ '--force', ]))
Tenga en cuenta que puede pasar las opciones que debe utilizar un Optimizer
a su constructor.
¿Quiere utilizar otra utilidad de línea de comandos para optimizar sus imágenes? Ningún problema. Simplemente escriba su propio optimizador. Un optimizador es cualquier clase que implemente la interfaz SpatieImageOptimizerOptimizersOptimizer
:
espacio de nombres SpatieImageOptimizerOptimizers; utilizar SpatieImageOptimizerImage; optimizador de interfaz {/** * Devuelve el nombre del binario que se ejecutará. * * @return string */public function binarioName(): string;/** * Determina si el optimizador puede manejar la imagen dada. * * @param SpatieImageOptimizerImage $image * * @return bool */public function canHandle(Image $image): bool;/** * Establece la ruta a la imagen que debe optimizarse. * * @param string $imagePath * * @return $this */public function setImagePath(string $imagePath);/** * Establece las opciones que debe usar el optimizador. * * @param array $options * * @return $this */public function setOptions(array $options = []);/** * Obtiene el comando que debe ejecutarse. * * @return cadena */función pública getCommand(): cadena; }
Si desea ver una implementación de ejemplo, eche un vistazo a los optimizadores existentes que se incluyen con este paquete.
Puede agregar fácilmente su optimizador utilizando el método addOptimizer
en OptimizerChain
.
utilizar SpatieImageOptimizerImageOptimizerFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->addOptimizer(nuevo YourCustomOptimizer()) ->optimizar($pathToImage);
De forma predeterminada, el paquete no arrojará ningún error y simplemente funcionará en silencio. Para verificar qué está haciendo el paquete, puede configurar un registrador:
utilizar SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->useLogger(nuevo MyLogger()) ->optimizar($pathToImage);
Un registrador es una clase que implementa PsrLogLoggerInterface
. Una buena biblioteca de registro que es totalmente compatible es Monolog. El paquete escribirá en el registro qué Optimizers
se utilizan, qué comandos se ejecutan y su salida.
Aquí hay algunos ejemplos de conversiones de la vida real realizadas por este paquete.
Metodología para imágenes JPG, WEBP, AVIF: la imagen original se ha introducido en spatie/image (utilizando el controlador GD predeterminado) y se ha redimensionado a 2048 px de ancho:
SpatieImageImage::load('original.jpg') ->ancho(2048) ->guardar('imagen.jpg'); // imagen.png, imagen.webp, imagen.avif
Original
771KB
Optimizado
511 KB (-33,7%, DSSIM: 0,00052061)
Créditos: Jeff Sheldon, vía Unsplash
Original
461KB
Optimizado
184 KB (-60,0%, DSSIM: 0,00166036)
Créditos: Jeff Sheldon, vía Unsplash
Original
725KB
Optimizado
194 KB (-73,2%, DSSIM: 0,00163751)
Créditos: Jeff Sheldon, vía Unsplash
Original: Photoshop 'Guardar para web' | PNG-24 con transparencia
39 KB
Optimizado
16KB (-59%, DSSIM: 0,00000251)
Original: ilustrador | Exportación SVG optimizada para web
25 KB
Optimizado
20KB (-21,5%)
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
prueba de compositor
Consulte CONTRIBUCIÓN para obtener más detalles.
Si encuentra un error relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
Eres libre de utilizar este paquete (tiene licencia del MIT), pero si llega a tu entorno de producción, te agradeceremos mucho que nos envíes una postal desde tu ciudad natal, mencionando cuál de nuestros paquetes estás utilizando.
Nuestra dirección es: Spatie, Kruikstraat 22, 2018 Amberes, Bélgica.
Publicamos todas las postales recibidas en el sitio web de nuestra empresa.
Freek Van der Herten
Todos los contribuyentes
Este paquete ha sido inspirado en psliwa/image-optimizer.
Apoyo emocional proporcionado por Joke Forment
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.