ImageMagick: automatize redimensionamento e conversão de imagens
Use o ImageMagick para encaixar JPEGs em uma caixa de 800 × 600 e salvar cópias em PNG mantendo os originais. Comece com uma pasta sem subpastas e depois use o script Bash abaixo para processar pastas aninhadas sem perder arquivos que compartilham o mesmo nome. Cada exemplo cria um novo diretório de saída e se recusa a reutilizá-lo.
O PNG é útil quando a próxima etapa do seu fluxo de trabalho precisa de armazenamento de imagem sem perdas. Converter um JPEG para PNG não recupera detalhes já perdidos na compressão JPEG nem garante um arquivo menor. Se o seu objetivo é ter fotografias menores para um site, veja a receita de JPEG.
Configure o ImageMagick 7
Estes exemplos exigem Bash, find e ImageMagick 7 com suporte a JPEG e PNG. Eles foram testados
no macOS com ImageMagick 7.1.2-31 e Bash 3.2.57 e 5.3.20. Execute os blocos de comando no Bash;
caso contrário, o Terminal do macOS pode iniciar outro shell.
Com o Homebrew instalado, siga as instruções de instalação para macOS do ImageMagick:
brew install imagemagick
No Linux, verifique qual versão a sua distribuição oferece antes de instalar. Por exemplo,
o pacote imagemagick do Ubuntu 24.04 fornece a versão 6.
Estes comandos exigem a versão 7; consulte os downloads oficiais
se o seu pacote não a fornecer.
O ImageMagick também tem um instalador para Windows, mas este passo a passo não aborda o PowerShell nem o Prompt de Comando. Uma instalação no Windows, por si só, não fornece o ambiente Bash usado aqui.
Verifique a versão instalada e os formatos disponíveis:
magick -version && magick -list format
Procure ImageMagick 7 na linha de versão e rw na coluna de modo tanto para JPEG quanto para PNG.
Se magick estiver ausente, corrija a instalação ou o PATH antes de continuar.
Redimensione e converta uma pasta sem subpastas
No seu diretório de trabalho, crie uma pasta de entrada e coloque alguns JPEGs nela. Este comando de configuração também aceita um diretório de entrada existente e não altera o conteúdo dele:
mkdir -p input_images
Os comandos curtos processam arquivos .jpg não ocultos e em minúsculas diretamente dentro de input_images.
Para pastas aninhadas, outras extensões de JPEG ou nomes com colchetes ou caracteres curinga,
use o script recursivo.
mogrify normalmente sobrescreve seus arquivos de entrada.
Aqui, -path direciona as cópias em PNG para um novo diretório. O && impede a conversão se esse
diretório já existir ou não puder ser criado:
mkdir resized_png &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '800x600>' -format png -path resized_png ./input_images/*.jpg
-auto-orient aplica a orientação EXIF do JPEG antes de redimensionar.
-regard-warnings faz com que avisos,
como os de um JPEG truncado, façam o comando falhar. Uma falha pode deixar saída parcial; inspecione-a
antes de usar o lote. Corrija a entrada e escolha um novo diretório de saída para outra execução.
A configuração de nome de arquivo literal impede que nomes de saída
como photo%03d.png se tornem photo000.png. Apenas colocar os argumentos do shell entre aspas não
desativa a formatação de nomes de arquivo do ImageMagick.
A geometria de redimensionamento 800x600> preserva
a proporção e só reduz imagens que excedem a caixa. Coloque-a entre aspas para que o Bash não interprete >
como redirecionamento de saída. Para limitar apenas a largura, use '800x>'.
| Dimensões de entrada | Dimensões de saída com 800x600> |
|---|---|
| 1600 × 900 | 800 × 450 |
| 1200 × 1600 | 450 × 600 |
| 320 × 240 | 320 × 240 |
Verifique o que foi gravado:
magick identify -format '%f: %m %wx%h\n' ./resized_png/*.png
Por exemplo, um wide.jpg de 1600 × 900 produz wide.png: PNG 800x450. A caixa delimitadora é um limite,
então a saída não precisa ter exatamente 800 × 600.
Automatize pastas aninhadas
Um find recursivo seguido de mogrify -path achataria a árvore de diretórios: trip/photo.jpg
e work/photo.jpg poderiam sobrescrever um ao outro. Este script preserva os subdiretórios e acrescenta
.png ao nome completo do arquivo de origem, mantendo photo.jpg e photo.jpeg distintos também.
Salve isto como um novo arquivo chamado process_images.sh ao lado de input_images. Mantenha o diretório de saída
fora da árvore de entrada. Ele não pode existir previamente.
#!/usr/bin/env bash
set -euo pipefail
INPUT_DIR="input_images"
OUTPUT_DIR="output_images"
if [[ ! -d "$INPUT_DIR" ]]; then
printf 'Input directory not found: %s\n' "$INPUT_DIR" >&2
exit 1
fi
mkdir "$OUTPUT_DIR"
find "$INPUT_DIR" -type f \( -iname '*.jpg' -o -iname '*.jpeg' \) -print0 |
(
found=false
while IFS= read -r -d '' file; do
found=true
relative=${file#"$INPUT_DIR"/}
output="$OUTPUT_DIR/$relative.png"
mkdir -p "${output%/*}"
# Capture diagnostics separately from PNG bytes; warnings also reject the image.
if ! diagnostics=$(magick -regard-warnings jpeg:- -auto-orient -resize '800x600>' png:- \
< "$file" 2>&1 > "$output") || [[ -n "$diagnostics" ]]; then
rm -f "$output"
printf 'Could not convert: %s\n%s\n' "$file" "$diagnostics" >&2
exit 1
fi
done
if [[ "$found" == false ]]; then
printf 'No JPEG files found in %s\n' "$INPUT_DIR" >&2
exit 1
fi
)
printf 'Images have been resized and converted into %s\n' "$OUTPUT_DIR"
Execute-o a partir do diretório que contém o script e input_images:
bash process_images.sh
Por exemplo, input_images/trip/photo.jpg se torna output_images/trip/photo.jpg.png.
O script aceita .jpg e .jpeg com qualquer combinação de maiúsculas e minúsculas. find -print0 e read -d '' preservam
espaços e quebras de linha, enquanto o redirecionamento do shell mantém nomes como -cover.jpg e
photo%03d.jpg literais tanto na entrada quanto na saída. Os
fluxos padrão do ImageMagick transportam os bytes do JPEG e do PNG.
O script verifica os diagnósticos da conversão além do código de saída, então rejeita um JPEG
truncado mesmo que o ImageMagick apenas exiba um aviso. Ele informa a conclusão somente depois que
todo o pipeline é bem-sucedido. pipefail também detecta um diretório ilegível relatado por find. Um
diretório de entrada ausente, nenhum JPEG correspondente ou uma conversão com falha retorna um código
de saída diferente de zero. A saída da imagem com falha é removida; as saídas anteriores
bem-sucedidas permanecem. Revise um lote com falha e escolha um novo
OUTPUT_DIR antes de tentar novamente. Use este fluxo de trabalho para lotes locais de JPEGs estáticos comuns.
Adapte a saída para o seu site
Estes dois comandos opcionais usam a mesma pasta input_images sem subpastas do primeiro exemplo. Cada um
exige seu próprio destino novo e não mexe nos originais. Um comando com falha pode deixar um
lote parcial, assim como acontece com resized_png.
Criando miniaturas
Para miniaturas quadradas, preencha o quadrado com '150x150^' e depois recorte a partir do centro usando
-gravity center -extent 150x150. Isso pode ampliar imagens pequenas e cortar elementos próximos de uma borda:
mkdir thumbnails &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '150x150^' -gravity center -extent 150x150 \
-format jpg -path thumbnails ./input_images/*.jpg
Otimizando imagens para a web
Para manter fotografias como JPEGs, combine a caixa delimitadora com uma configuração de qualidade JPEG:
mkdir optimized &&
magick mogrify -regard-warnings -define registry:filename:literal=true \
-auto-orient -resize '800x600>' -quality 85 -path optimized ./input_images/*.jpg
-quality 85 é uma configuração do codificador na
escala de qualidade JPEG, não uma promessa de 85% de qualidade visual nem de uma redução específica no
tamanho do arquivo. Recodificar JPEGs causa perdas. Compare os bytes e a aparência do resultado com os
originais antes de escolher uma configuração; uma origem que já está muito comprimida pode ficar maior.
Se a saída parecer errada, verifique primeiro os metadados de orientação e depois confirme se você queria uma caixa delimitadora ou um recorte quadrado. Se um comando se recusar a executar novamente, verifique o destino dele: estes exemplos exigem deliberadamente um novo diretório de saída para proteger o resultado anterior.
