slimg - CLI de otimização de imagens feito em Rust (54 GB → 8 GB)
(github.com/clroot)Por que foi criado?
Eu usava bastante a ferramenta Squoosh, do Google, mas a versão CLI dava erro ao executar, e a versão web era utilizável, porém... com aquele estado típico de abandono do Google, no fim decidi fazer a minha própria. Procurei alternativas, mas nenhuma me agradou.
O que é o slimg?
É uma CLI de otimização de imagens escrita em Rust. Suporta conversão entre JPEG, WebP, PNG, AVIF e QOI, além de redimensionamento e otimização de qualidade. Usa codecs modernos como MozJPEG, OxiPNG e ravif.
Resultado real de uso:
Otimizei em lote 54 GB de fotos pessoais e reduzi para 8 GB. (redução de 85%) A qualidade ficou em um nível em que a diferença quase não é perceptível a olho nu.
# Processamento em lote de diretório (paralelo)
slimg convert ./photos --format webp --quality 85 --recursive
# Redimensionamento + conversão
slimg resize photo.jpg --width 800 --format avif --quality 70
Características técnicas:
- Processamento paralelo em todos os núcleos da CPU com Rayon
- Sobrescrita segura com arquivo temporário → atomic rename
- Separação entre biblioteca (
slimg-core) e CLI (reutilizável) - Desempenho nativo com bindings para codecs em C
Instalação:
brew install clroot/tap/slimg
# https://github.com/clroot/slimg/releases
GitHub: https://github.com/clroot/slimg
7 comentários
Os bindings em Kotlin do slimg foram adicionados. Agora é possível processar imagens com facilidade em servidores/backends.
Eu também usei um LLM para criar algo que remove o fundo de arquivos gerados em PNG, converte para SVG, reduz o tamanho e preserva a qualidade. Foi feito em Rust, e a conversão para SVG funcionou muito bem, mas para reduzir o tamanho dos SVGs não tive outra opção além de usar um programa chamado
svgo. Osvgoé excelente em remover código desnecessário dos SVGs, mas me parece ser uma área que exige conhecimento de domínio, então eu vinha aproveitando osvgo.No entanto, eu não tinha pensado em usar codecs mais recentes como MozJPEG, OxiPNG e ravif. Agora fiquei com vontade de tentar também. Obrigado pela inspiração.
Eu vinha usando SalOne22/rimage, então vou ter que ver como este se sai. Por enquanto, parece uma vantagem o fato de oferecer bindings para Python.
Os bindings em Python do slimg também foram adicionados.
Eu também uso uma ferramenta que fiz em Rust para converter em lote imagens agrupadas em arquivos compactados, então acho que vou tentar mudar as chamadas internas para este repositório.
Por acaso existe algum motivo específico para a decodificação de AVIF ser possível apenas no macOS?
Agora, se você usar a versão 0.1.3, a decodificação de AVIF também será possível no Windows e no Linux.
Isso acontece porque, no ambiente do GitHub Actions usado para fazer o build, a versão da biblioteca que lida com AVIF não é compatível. Em breve, pretendo ajustar o ambiente de build para também oferecer suporte a AVIF em máquinas Linux.