Este pacote pode otimizar PNGs, JPGs, WEBPs, AVIFs, SVGs e GIFs executando-os por meio de uma cadeia de várias ferramentas de otimização de imagens. Veja como você pode usá-lo:
use SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
A imagem em $pathToImage
será substituída por uma versão otimizada que deverá ser menor. O pacote detectará automaticamente quais binários de otimização estão instalados em seu sistema e os utilizará.
Aqui estão alguns exemplos de conversões que foram feitas por este pacote.
Amando Laravel? Em seguida, vá para a integração específica do Laravel.
Usando WordPress? Em seguida, experimente o comando WP CLI.
Entusiasta do SilverStripe? Não perca tempo, acesse o módulo SilverStripe.
Investimos muitos recursos na criação dos melhores pacotes de código aberto. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando qual(is) de nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nosso mural virtual de cartões postais.
Você pode instalar o pacote via compositor:
compositor requer espaço/otimizador de imagem
O pacote usará esses otimizadores se eles estiverem presentes no seu sistema:
JpegOptim
Opção
Pngquant 2
SVGO 1
GIFSÍCULO
webp
avifenc
Veja como instalar todos os otimizadores no Ubuntu/Debian:
sudo apt-get instalar jpegoptim sudo apt-get install optipng sudo apt-get instalar pngquant sudo npm instalar -g svgo sudo apt-get install gifsicle sudo apt-get install webp sudo apt-get install libavif-bin # mínimo 0.9.3
E aqui está como instalar os binários no MacOS (usando Homebrew):
preparar instalar jpegoptim opção de instalação de cerveja preparar instalar pngquant npm instalar -g svgo preparar instalar gifsicle preparar instalação webp preparar instalar libavif
E aqui está como instalar os binários no Fedora/RHEL/CentOS:
sudo dnf instalar epel-release sudo dnf instalar jpegoptim sudo dnf instalar optipng sudo dnf instalar pngquant sudo npm instalar -g svgo sudo dnf instalar gifsicle sudo dnf instalar ferramentas libwebp sudo dnf instalar ferramentas libavif
O pacote decidirá automaticamente quais ferramentas usar em uma imagem específica.
Os JPGs ficarão menores ao executá-los por meio do JpegOptim. Estas opções são usadas:
-m85
: armazenará a imagem com qualidade de 85%. Esta configuração parece satisfazer as regras de compactação Pagespeed do Google
--strip-all
: remove todas as informações de texto, como comentários e dados EXIF
--all-progressive
: isso garantirá que a imagem resultante seja progressiva, o que significa que ela pode ser baixada usando várias passagens de detalhes progressivamente maiores.
Os PNGs ficarão menores executando-os por meio de duas ferramentas. O primeiro é o Pngquant 2, um compressor PNG com perdas. Não definimos opções extras, seus padrões são usados. Depois disso, passamos a imagem por uma segunda: Optipng. Estas opções são usadas:
-i0
: isso resultará em uma imagem digitalizada progressiva e não entrelaçada
-o2
: define o nível de otimização para dois (vários testes de compactação IDAT)
SVGs serão minimizados pelo SVGO. A configuração padrão do SVGO será usada, com a omissão dos plug-ins cleanupIDs
e removeViewBox
porque eles são conhecidos por causar problemas ao exibir vários SVGs otimizados em uma página.
Esteja ciente de que o SVGO pode quebrar seu SVG. Você encontrará mais informações sobre isso nesta excelente postagem de Sara Soueidan.
Os GIFs serão otimizados pelo Gifsicle. Estas opções serão usadas:
-O3
: define o nível de otimização para o máximo do Gifsicle, o que produz os resultados mais lentos, porém melhores
WEBPs serão otimizados pelo Cwebp. Estas opções serão usadas:
-m 6
para o método de compactação mais lento, a fim de obter a melhor compactação.
-pass 10
para maximizar a quantidade de aprovação na análise.
-mt
multithreading para algumas melhorias de velocidade.
-q 90
Fator de qualidade que traz as alterações menos perceptíveis.
(As configurações são originais retiradas daqui)
AVIFs serão otimizados pela avifenc. Estas opções serão usadas:
-a cq-level=23
: Nível de qualidade constante. Valores mais baixos significam melhor qualidade e maior tamanho de arquivo (0-63).
-j all
: Número de jobs (threads de trabalho, all
usam todos os núcleos disponíveis).
--min 0
: Quantizador mínimo para cor (0-63).
--max 63
: Quantizador máximo para cor (0-63).
--minalpha 0
: quantizador mínimo para alfa (0-63).
--maxalpha 63
: Quantizador máximo para alfa (0-63).
-a end-usage=q
Modo de controle de taxa definido para modo Qualidade Constante.
-a tune=ssim
: SSIM para ajustar o codificador para métrica de distorção.
(As configurações são originais tiradas daqui e daqui)
Esta é a maneira padrão de usar o pacote:
use SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage);
A imagem em $pathToImage
será substituída por uma versão otimizada que deverá ser menor.
O pacote detectará automaticamente quais binários de otimização estão instalados em seu sistema e os utilizará.
Para manter a imagem original, você pode passar por um segundo argumento optimize
:
use SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain->optimize($pathToImage, $pathToOutput);
Nesse exemplo, o pacote não tocará em $pathToImage
e gravará uma versão otimizada em $pathToOutput
.
Você pode definir o tempo máximo em segundos que cada otimizador individual em uma cadeia pode usar chamando setTimeout
:
$optimizerChain->setTimeout(10) ->otimizar($pathToImage);
Neste exemplo, cada otimizador da cadeia terá no máximo 10 segundos para realizar seu trabalho.
Se você quiser personalizar a cadeia de otimizadores, poderá fazê-lo adicionando Optimizer
s manualmente a um OptimizerChain
.
Aqui está um exemplo onde queremos que apenas optipng
e jpegoptim
sejam usados:
usar SpatieImageOptimizerOptimizerChain;usar SpatieImageOptimizerOptimizersJpegoptim;usar SpatieImageOptimizerOptimizersPngquant;$optimizerChain = (novo OptimizerChain) ->addOptimizer(new Jpegoptim([ '--strip-all', '--all-progressive', ])) ->addOptimizer(new Pngquant([ '--force', ]))
Observe que você pode passar as opções que um Optimizer
deve usar para seu construtor.
Quer usar outro utilitário de linha de comando para otimizar suas imagens? Sem problemas. Basta escrever seu próprio otimizador. Um otimizador é qualquer classe que implementa a interface SpatieImageOptimizerOptimizersOptimizer
:
namespace SpatieImageOptimizerOptimizers;usar SpatieImageOptimizerImage;otimizador de interface {/** * Retorna o nome do binário a ser executado. * * @return string */public function binaryName(): string;/** * Determina se a imagem fornecida pode ser manipulada pelo otimizador. * * @param SpatieImageOptimizerImage $image * * @return bool */public function canHandle(Image $image): bool;/** * Defina o caminho para a imagem que deve ser otimizada. * * @param string $imagePath * * @return $this */public function setImagePath(string $imagePath);/** * Defina as opções que o otimizador deve usar. * * @param array $options * * @return $this */public function setOptions(array $options = []);/** * Obtenha o comando que deve ser executado. * * @return string */função pública getCommand(): string; }
Se você quiser ver um exemplo de implementação, dê uma olhada nos otimizadores existentes fornecidos com este pacote.
Você pode adicionar facilmente seu otimizador usando o método addOptimizer
em um OptimizerChain
.
usar SpatieImageOptimizerImageOptimizerFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->addOptimizer(novo YourCustomOptimizer()) ->optimize($pathToImage);
Por padrão, o pacote não gerará nenhum erro e apenas operará silenciosamente. Para verificar o que o pacote está fazendo você pode definir um registrador:
usar SpatieImageOptimizerOptimizerChainFactory;$optimizerChain = OptimizerChainFactory::create();$optimizerChain ->useLogger(novo MyLogger()) ->otimizar($pathToImage);
Um logger é uma classe que implementa PsrLogLoggerInterface
. Uma boa biblioteca de log totalmente compatível é a Monolog. O pacote irá gravar no log quais Optimizers
são usados, quais comandos são executados e sua saída.
Aqui estão alguns exemplos de conversões da vida real feitos por este pacote.
Metodologia para imagens JPG, WEBP, AVIF: a imagem original foi alimentada para spatie/image (usando o driver GD padrão) e redimensionada para largura de 2048px:
SpatieImageImage::load('original.jpg') ->largura(2048) ->salvar('imagem.jpg'); //imagem.png, imagem.webp, imagem.avif
Original
771 KB
Otimizado
511 KB (-33,7%, DSSIM: 0,00052061)
créditos: Jeff Sheldon, via Unsplash
Original
461 KB
Otimizado
184 KB (-60,0%, DSSIM: 0,00166036)
créditos: Jeff Sheldon, via Unsplash
Original
725 KB
Otimizado
194 KB (-73,2%, DSSIM: 0,00163751)
créditos: Jeff Sheldon, via Unsplash
Original: Photoshop 'Salvar para web' | PNG-24 com transparência
39 KB
Otimizado
16 KB (-59%, DSSIM: 0,00000251)
Original: Ilustrador | Exportação SVG otimizada para web
25 KB
Otimizado
20 KB (-21,5%)
Consulte CHANGELOG para obter mais informações sobre o que mudou recentemente.
teste de compositor
Consulte CONTRIBUINDO para obter detalhes.
Se você encontrou um bug relacionado à segurança, envie um email para [email protected] em vez de usar o rastreador de problemas.
Você é livre para usar este pacote (é licenciado pelo MIT), mas se ele chegar ao seu ambiente de produção, agradecemos muito que você nos envie um cartão postal de sua cidade natal, mencionando quais de nossos pacotes você está usando.
Nosso endereço é: Spatie, Kruikstraat 22, 2018 Antuérpia, Bélgica.
Publicamos todos os cartões postais recebidos no site da nossa empresa.
Freek Van der Herten
Todos os colaboradores
Este pacote foi inspirado em psliwa/image-optimizer
Apoio emocional fornecido por Joke Forment
A licença MIT (MIT). Consulte Arquivo de licença para obter mais informações.