O Automator, apesar de pouco popular, é uma das ferramentas mais úteis do macOS. Muitas das tarefas aborrecidas do dia-a-dia podem ser simplificadas com esta aplicação.
Exemplo disso é a conversão de imagens (por exempo, de HEIC para JPG), como tinha mencionado neste artigo. Como sou também grande fã do formato de imagem AVIF, decidi investigar se seria possível converter imagens para este formato através de uma Quick Action do Automator, ao invés de abrir o terminal.
Pelo caminho, aprendi a executar comandos da shell através do Automator e descobri que é até bastante fácil! 😎
Convertendo Imagens para AVIF no Terminal
Comecei por instalar este encoder através do Homebrew, correndo o comando brew install joedrago/repo/avifenc
. Se precisares de ajuda com o Homebrew, sugiro que leias este pequeno guia.
Uma vez instalado, converter uma imagem para AVIF é bastante simples. Basta escrever avifenc -q 55 NOME-DO-FICHEIRO.JPG NOME-DO-FICHEIRO.AVIF
para obter o ficheiro desejado.
De notar que o ficheiro original não tem que ser um JPG (é apenas um exemplo) e o valor “55” é a qualidade que definimos para o ficheiro final. Tenho obtido ótimos resultados com este valor.
Convertendo para AVIF através de uma Quick Action do Automator
Vamos criar uma Quick Action para que possamos converter para AVIF através do Finder, fazendo simplesmente right-click na imagem pretendida.
Para tal, abrimos o Automator e clicamos em New > Quick Action.
Queremos criar um Workflow que recebe ficheiros a partir de qualquer aplicação. Até podias ser mais específico aqui e definir que só queres ficheiros de imagem, mas no código que vamos inserir já vamos realizar essa filtragem.
De seguida, insere uma acção do tipo “Run Shell Script”. Define a tua shell (provavelmente a /bin/zsh
) e altera o “Pass input” para “as arguments”. Este passo é super importante!
Finalmente, copia este código:
for f in "$@"
do
if file --mime-type "$f" | grep -q "image"; then
filename="${f%.*}"
/opt/homebrew/bin/avifenc -q 55 "$f" "$filename.avif"
else
echo "Skipping non-image file: $f"
fi
done
Para garantir que o código funciona, confirma onde ficou instalado o avifenc
no teu sistema, escrevendo which avifenc
no terminal. No meu caso, está em /opt/homebrew/bin/avifenc
. Deves inserir a localização na totalidade—se só correres o comando escrevendo avifenc
, não funcionará.
Sobre o Código
Como queremos a conveniência de converter vários ficheiros em simultâneo, vamos ter de encapsular tudo isto dentro de um loop. Mas como chegamos aos ficheiros? 🤔
Serão passados por parâmetros. "$@"
é uma sintaxe especial em scripts de shell que representa todos os parâmetros posicionais passados para um script ou uma função.
Conjugando estes 2 conceitos, chegamos afor f in "$@"
: um loop que vai iterar sobre todos os ficheiros, onde a variável f
assume o valor de cada arquivo em cada iteração.
Acrescentei ainda uma condição para a conversão só ocorrer se o tipo de ficheiro for uma imagem. Isso significa que podes selecionar uma pasta inteira que tenha imagens, PDFs e ficheiros de texto, e a conversão só acontecerá nos ficheiros de imagem.
Esta magia acontece com o código if file --mime-type "$f" | grep -q "image"; then
que valida o tipo de imagem pelo MIME type.
Por fim, criei uma nova variável para ficar com o nome do ficheiro sem a extensão da imagem (PNG, JPG, etc): filename="${f%.*}"
Agora, a parte fácil, e que já tínhamos visto no terminal: correr a conversão propriamente dita:/opt/homebrew/bin/avifenc -q 55 "$f" "$filename.avif"
O resultado final será este:
Testando a nossa Quick Action
Podes gravar a tua Quick Action (eu gravei como Image/Convert to AVIF
) e testá-la de imediato no Finder:
Após uns segundos, o ficheiro AVIF gerado surgirá na mesma página. Está feito! ✌️