Criar colagens de imagens com a CLI do ImageMagick
Passe ao ImageMagick uma lista explícita de imagens para criar uma colagem em uma ordem previsível. O script Bash abaixo cria uma grade PNG, mantém seus arquivos de origem inalterados e lê apenas os arquivos que você listar. Ele também se recusa a usar um destino existente, então uma nova execução não pode substituir uma colagem.
Configurar o ImageMagick
Use Linux com Bash e uma instalação do ImageMagick 7 que inclua suporte a JPEG e PNG. Este passo a passo foi testado com GNU Bash 5.3.15 e ImageMagick 7.1.2-31 Q16-HDRI. O ImageMagick 6 e outros sistemas operacionais ficam fora do escopo testado deste exemplo.
Cole os blocos de comando em um shell Bash com errexit desativado, para que um comando com falha
devolva o controle ao seu prompt. O script salvo abaixo define seu próprio tratamento de erros.
Verifique se as ferramentas estão no seu PATH:
bash --version && magick --version
Configurar limites de recursos
Mantenha a política de segurança existente da sua instalação. Estes pequenos exemplos não exigem uma edição global da política. Você pode inspecionar os limites atuais com:
magick -list resource
Imagens maiores ainda podem atingir os limites configurados mesmo quando suas miniaturas são pequenas, porque a decodificação vem primeiro. Use menos imagens de origem, ou imagens menores, antes de alterar uma política. A documentação de políticas de recursos do ImageMagick explica os controles.
Preparar suas imagens
Comece em um diretório com permissão de escrita. Este bloco cria um novo diretório collage-demo com três
JPEGs de exemplo e um diretório de saída separado. Ele falha se collage-demo já existir e mantém seu
shell no diretório original:
(
mkdir collage-demo || exit 1
cd collage-demo || exit 1
mkdir photos collages || exit 1
magick -size 320x160 xc:red photos/red.jpg &&
magick -size 160x320 xc:lime photos/green.jpg &&
magick -size 240x240 xc:blue photos/blue.jpg
)
Salve o script a seguir como collage-demo/make-collage.sh. Seus argumentos são um novo destino .png
seguido de um ou mais arquivos JPEG ou PNG locais e estáticos. Coloque cada caminho entre aspas e
liste os arquivos na ordem em que você quer que eles apareçam. Não use *.jpg em um diretório que
contenha imagens geradas: o shell incluiria essas imagens também.
O ImageMagick tem sua própria sintaxe de nomes de arquivo, incluindo curingas e seletores de quadro. Apenas colocar aspas no shell não a desativa. O script copia cada entrada para um nome de arquivo temporário e comum antes da decodificação e, em seguida, copia o PNG finalizado para o seu destino literal. Isso também lida com caminhos que contêm espaços, colchetes ou sinais de porcentagem.
#!/usr/bin/env bash
set -euo pipefail
if (( $# < 2 )); then
printf 'Usage: bash make-collage.sh OUTPUT.png INPUT [INPUT ...]\n' >&2
exit 2
fi
output=$1
shift
if [[ "$output" != *.png ]]; then
printf 'Output must end in .png: %q\n' "$output" >&2
exit 2
fi
if [[ -e "$output" || -L "$output" ]]; then
printf 'Refusing existing output: %q\n' "$output" >&2
exit 1
fi
work=$(mktemp -d)
trap 'rm -rf -- "$work"' EXIT
tiles=()
for input in "$@"; do
if [[ ! -f "$input" || ! -r "$input" ]]; then
printf 'Not a readable file: %q\n' "$input" >&2
exit 1
fi
if ! cp -- "$input" "$work/source"; then
printf 'Cannot copy input: %q\n' "$input" >&2
exit 1
fi
tile="tile-${#tiles[@]}.png"
if ! (
cd -- "$work" &&
magick -regard-warnings 'source[0]' -auto-orient -colorspace sRGB \
-thumbnail 200x200 -background white -gravity center -extent 200x200 \
-alpha remove -alpha off -strip -depth 8 "$tile"
); then
printf 'Cannot decode input: %q\n' "$input" >&2
exit 1
fi
tiles+=("$tile")
done
(
cd -- "$work" &&
magick montage -regard-warnings "${tiles[@]}" -tile 3x \
-geometry 200x200+2+2 -background white -strip result.png
)
cp -- "$work/result.png" "$output"
printf 'Created %q\n' "$output"
Cada imagem cabe dentro de um bloco de 200×200 sem corte nem distorção; um preenchimento branco ocupa a área restante. A transparência é composta sobre branco, incluindo pixels parcialmente transparentes. O script aplica os metadados de orientação antes do redimensionamento e converte as cores para sRGB antes da composição. Esta é uma conversão genérica. Quando a correspondência precisa de cores for importante, especialmente para imagens CMYK ou com perfil ICC, use um fluxo de trabalho com perfis de cor adequado.
Use imagens locais completas em que você confia. -regard-warnings
trata alguns avisos de decodificação como erros; ele não valida a integridade da imagem. Na
compilação testada, um JPEG com payload truncado ainda produziu uma colagem e retornou sucesso, com
pixels incorretos perto da parte inferior do seu bloco. Verifique a entrada e o bloco resultante
inteiro quando houver possibilidade de dano. Apenas o primeiro quadro é usado se uma entrada contiver
uma sequência.
Criar uma colagem com o montage
No diretório que contém collage-demo, execute:
(
cd collage-demo &&
bash make-collage.sh collages/example.png \
photos/red.jpg photos/green.jpg photos/blue.jpg
)
Abra collage-demo/collages/example.png. A imagem deve ter 612×204 pixels, com blocos vermelho, verde e azul
da esquerda para a direita. A imagem em paisagem tem preenchimento branco acima e abaixo; a imagem
em retrato tem preenchimento nas laterais. Há 2 pixels ao redor de cada bloco, o que gera um espaço
de 4 pixels entre blocos vizinhos. Verifique cada bloco, incluindo as bordas, ao usar fotografias
reais.
Se você repetir este comando, ele falha com “Refusing existing output” e mantém esse PNG inalterado. Escolha um novo destino para criar outra colagem. O script copia o resultado somente depois que todos os blocos e o montage forem concluídos com sucesso; um erro do sistema de arquivos durante essa cópia final ainda pode deixar uma saída parcial. Execute as tarefas sequencialmente: a verificação de existência não protege contra gravações simultâneas no mesmo destino. Mantenha os arquivos de origem estáveis enquanto uma tarefa é executada.
Personalizar o layout
As opções do montage do script controlam a grade. -tile 3x
reserva três colunas e usa quantas linhas forem necessárias. -geometry 200x200+2+2 usa os blocos
preparados de 200×200 com 2 pixels de espaço ao redor. Quatro entradas produzem uma imagem de
612×408; as células não usadas da última linha ficam brancas. Uma ou duas entradas ainda reservam
três colunas. Para alterar o tamanho das miniaturas, mantenha -thumbnail, -extent e o tamanho
em -geometry consistentes.
Processamento em lote com tratamento de erros
Este bloco cria duas colagens a partir de conjuntos de entrada escolhidos explicitamente. Ele continua após uma tarefa com falha e retorna um status diferente de zero se alguma das tarefas falhar, mesmo quando a última for bem-sucedida:
(
cd collage-demo || exit 1
status=0
bash make-collage.sh collages/warm.png \
photos/red.jpg photos/green.jpg || status=1
bash make-collage.sh collages/cool.png \
photos/green.jpg photos/blue.jpg || status=1
exit "$status"
)
Arquivos de entrada ausentes e vazios, e arquivos que geram erros de decodificação, fazem sua tarefa falhar e identificam o caminho selecionado no erro. Danos recuperáveis têm a limitação descrita acima. Quando nenhum caminho de entrada é passado, a mensagem de uso é exibida. Saídas existentes também contam como tarefas com falha; as tarefas bem-sucedidas continuam disponíveis.
Solução de problemas
Se magick não for encontrado, verifique se você instalou a versão 7 e se o diretório do executável
está no PATH. Um decodificador de JPEG ou PNG ausente exige uma compilação com esse formato
habilitado; instalar apenas pacotes de cabeçalho não adiciona um decodificador a um binário
existente.
Para uma entrada com falha, leia o diagnóstico que contém o caminho original dela e, em seguida, inspecione esse arquivo. Para um erro de política de recursos, reduza a carga de trabalho e consulte a política da sua instalação. Para uma cópia final com falha, verifique se o diretório de saída existe e tem permissão de escrita antes de tentar um novo destino. O script não cria nenhum diretório de saída automaticamente.
Substitua os caminhos de exemplo pela sua própria lista de imagens assim que a demonstração funcionar. Mantenha a ordem de entrada explícita e escolha um novo destino PNG para cada colagem.
