Pesquisa de site

Automatize o processamento de imagens com este script Bash


Um script e o ImageMagick tornam a preparação de imagens para publicação rápida e fácil.

Os escritores não trabalham apenas com palavras, mas muitas vezes têm que trabalhar com imagens. A redação técnica envolve a apresentação de muitas capturas de tela para transmitir a tecnologia e os processos. Diferentes plataformas de publicação podem ter vários requisitos para imagens, como formato de imagem ou tamanho de arquivo.

Como consultor de TI e engenheiro de sistemas, escrevi muita documentação técnica como resultados do cliente, geralmente com o Microsoft Word (.doc) como formato exigido. Qualquer documento pode crescer rapidamente à medida que o conteúdo é adicionado. No início, as capturas de tela eram geralmente bitmaps (.bmp), que podem ter um tamanho de arquivo muito grande. Um documento que descreve a instalação de um sistema operacional em um servidor pode acabar sendo um arquivo muito grande.

Reduzir o tamanho das imagens sem torná-las ilegíveis foi um exercício trabalhoso. Os bitmaps podem ser convertidos em arquivos jpeg e posteriormente em arquivos png. A edição continuou a ser um desafio ainda mais tarde, quando mudei meu pacote de escritório para o LibreOffice. Felizmente, a maioria das ferramentas de captura de tela hoje salva em formatos menores, como png.

Opensource.com impõe certos limites às imagens usadas em seus artigos. Desenvolvi um método rápido de três etapas para preparar imagens para meus artigos. O primeiro passo é ser inteligente na preparação, como redimensionar uma janela ou alterar uma fonte. Duas etapas adicionais tornaram-se muito repetitivas. Isso serve para garantir que a imagem não exceda o limite de largura de 600 pixels e para aplicar uma borda.

O script prepimg.sh

Escrevi um script Bash chamado prepimg.sh para lidar com essas tarefas. Este script usa duas ferramentas do pacote ImageMagick.

Redimensionar a imagem

O utilitário de captura de tela salva a imagem no diretório Pictures com um nome genérico – algo como Screenshot-20210923222312.png. Meu script prepimg.sh verifica a largura em pixels dos arquivos neste diretório e redimensiona aqueles que excedem o limite. Esta etapa usa o programa identificar do conjunto ImageMagick para determinar a largura (%w).

$ identify -format %w Screenshot-20210903202655.png
1217

O valor da largura é atribuído à variável W para uso como comparador ao limite de 600. O próprio limite é configurável através da variável $MAXWIDTH. Se for determinado que a largura excede MAXWIDTH, outro programa ImageMagick chamado convert será chamado para reduzir a largura da imagem. Aqui está a função de processamento de imagem do meu script:

     if [ "$W" -gt "$MAXWIDTH" ]
     then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
         convert -resize "${MAXWIDTH}" \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     
     ...     

A imagem é reduzida em tamanho conforme necessário e salva em um diretório diferente definido pela variável $READY. Nesse caso, a imagem é redimensionada um pouco menor – 598 pixels – para permitir espaço para a adição de uma borda, que mostro a seguir.

Adicione uma borda à imagem

Às vezes, uma imagem pode parecer mesclada com o plano de fundo da página da web. Isso ocorre porque a cor do primeiro plano da imagem até a borda é a mesma cor do plano de fundo do site. Aqui está um exemplo:

Uma imagem sem borda. (CC BY-SA 4.0)

Como você pode ver na imagem acima, é impossível saber onde está a borda da imagem. Esse problema não se limita à cor branca. Depende de cada site individual e das cores do tema que ele usa. Portanto, se o fundo for vermelho e a borda da imagem também for vermelha, ocorre o mesmo problema. Meu script resolve isso usando a ferramenta convert. A opção -border adiciona uma borda a cada arquivo de imagem com tamanho de 1 pixel. Esta opção por si só seria suficiente, mas também quero definir a cor usando a opção -bordercolor. Aqui está um exemplo:

convert -bordercolor black -border 1 Screenshot-20210903202655.png

Abaixo está a mesma imagem com uma borda. Isso não parece mais legal?

Uma imagem com borda. (CC BY-SA 4.0)

Sua imagem está pronta

Eu uso um loop for para percorrer o diretório de captura de tela. Ele chama a função process_img para cada arquivo. A função lida com largura e borda. O código completo faz algumas verificações de integridade, como garantir que o arquivo seja na verdade uma imagem.

process_img() {
     # verify that file is an image file, and then get dimensions
     if file "${SCREENSHOTS}"/"${1}" | grep -qE 'image|bitmap'; then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is an image"
         W=$(identify -format %w "${SCREENSHOTS}"/"${1}")
     else
         echo "File ${SCREENSHOTS}/${1} is not an image."
         W=0
     fi
 
     # resize and border
     if [ "$W" -gt "$MAXWIDTH" ]
     then
         [[ $VERBOSE -gt 0 ]] && echo "${1} is ${W} - reducing"
         convert -resize "${MAXWIDTH}" \
                 -bordercolor $BORDER \
                 -border 1 \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     else
         convert -bordercolor $BORDER \
                 -border 1 \
                 "${SCREENSHOTS}"/"${1}" \
                 "${READY}"/"${1}"
     fi
 }

A etapa final do script é salvar os arquivos processados em um subdiretório chamado Ready, que é determinado pela variável chamada $READY. Isso preserva os arquivos originais para uso posterior.

Uso

Prepimg.sh inclui o recurso de ajuda esperado que descreve seus argumentos e seu uso:

$ prepimg.sh -h
prepimg.sh Version 0.7 - written by Alan Formy-Duval
prepimg.sh [OPTIONS]
--verbose, -v Be verbose
--directory, -d Screenshot directory (default: /home/alan/Pictures/Screenshots)
--ready, -r Ready directory (default: /home/alan/Pictures/Screenshots/Ready)
--border, -b Border color (default: black)

Código e conclusão

O código apresentado no artigo está incompleto e deve ser considerado pseudocódigo. Você pode ver o script completo em meu repositório Git.

O pacote ImageMagick é um poderoso conjunto de ferramentas para manipulação de imagens. Você pode fazer muito mais coisas além das funções incorporadas no meu pequeno script. O correspondente Jim Hall também escreveu recentemente sobre como usá-lo para redimensionar uma imagem.

Quer você prefira scripts Bash ou codificação em outra linguagem, como C ou Python, a automação é uma grande ajuda. Vez após vez, tenho visto como um pouco de código pode reduzir tantas dores de cabeça e nos permitir aproveitar melhor nosso tempo.

Artigos relacionados: