Batch anexando grupos de imagens usando imagemagick

1

Eu quero usar o script convert do ImageMagick para adicionar duas imagens horizontalmente.

Isso é feito facilmente com convert +append input1.jpg input2.jpg output.jpg .

Eu tenho um diretório de arquivos jpeg no entanto. Eles se parecem com isso:

1996-0011-1 BEG Foo Bar Foo Bar.jpg
1996-0011-2 BEG Foo Bar Foo Bar.jpg
2001-0006-1 MEF FooBar.jpg
2001-0006-2 MEF FooBar.jpg
…

Os primeiros quatro dígitos são um ano, os próximos quatro dígitos são um número em execução. -1 é a parte esquerda, -2 a parte direita do arquivo de saída pretendido. A parte restante do nome do arquivo é uma cadeia com um número variável de espaços em branco.

Como eu adiciono esses grupos de duas imagens usando convert automaticamente? Eu imagino que isso pode ser feito trabalhando no primeiro, segundo,… par de arquivos independente do nome do arquivo ou agrupando esses arquivos de acordo com o nome do arquivo (isso seria benéfico para usuários que não têm apenas duas imagens) .

Eu uso o OS X. Obrigado pela sua ajuda.

    
por lejonet 19.06.2015 / 12:14

1 resposta

1

Assumindo duas coisas:

  • Você tem acesso a uma versão razoavelmente moderna do GNU bash, ou um shell compatível
  • A parte do identificador é sempre yyyy-nnnn- seguido por um ou mais dígitos (em sequência) seguidos por outra coisa

você pode usar a manipulação de string do bash e a expansão de curingas do shell para realizar o que deseja .

Execute isso em um diretório no qual os arquivos 1996-0011-1 BEG Foo Bar Foo Bar.jpg , 1996-0011-2 BEG Foo Bar Foo Bar.jpg , 2001-0006-1 MEF FooBar.jpg e 2001-0006-2 MEF FooBar.jpg já existam.

$ ls -1
1996-0011-1 BEG Foo Bar Foo Bar.jpg
1996-0011-2 BEG Foo Bar Foo Bar.jpg
2001-0006-1 MEF FooBar.jpg
2001-0006-2 MEF FooBar.jpg
$ mkdir old
$ for filename in *.jpg; do
>   test -f "$filename" && convert +append ${filename:0:10}* "${filename:0:9} ${filename:12}" && mv ${filename:0:10}* old/; done
$ ls -1
1996-0011 BEG Foo Bar Foo Bar.jpg
2001-0006 MEF FooBar.jpg
old/
$ rm -r old
$

A maneira como isso funciona é, para cada arquivo .jpg no diretório:

  1. teste se o arquivo existe e é um arquivo regular
  2. se o arquivo existir, execute convert , passando os dez primeiros caracteres do nome do arquivo (começando na posição de caractere 0, extraindo 10 caracteres) para exibir a expansão de curingas como parâmetros a serem convertidos, seguido pelo primeiro nove caracteres do nome do arquivo seguido por um espaço seguido por tudo a partir do 12º caractere em diante (você pode ajustar essa parte para obter o tipo de nome do arquivo de saída desejado; certifique-se de fazer o ajuste correspondente à invocação mv )
  3. se convert foi executado e foi bem-sucedido, mova todos os arquivos de entrada para um diretório separado, para removê-los do caminho

No final, você terá os arquivos de saída no diretório atual e todos os arquivos de entrada serão movidos para o diretório denominado old . Certifique-se de testar o snippet acima em dados não críticos primeiro.

    
por 19.06.2015 / 14:42