Nomeia automaticamente a saída da montagem com base nos arquivos de entrada

0

Eu tenho uma pasta com imagens separadas em canais:

IMAGE_A_R.jpg
IMAGE_A_G.jpg
IMAGE_A_B.jpg
IMAGE_A_RGB.jpg
IMAGE_A1_R.jpg
IMAGE_A1_G.jpg
IMAGE_A1_B.jpg
IMAGE_A1_RGB.jpg
IMAGE_B_R.jpg
IMAGE_B_G.jpg
IMAGE_B_B.jpg
IMAGE_B_RGB.jpg

O que eu estou fazendo agora é fazer imagens 4x1 usando montagem e nomeação, em seguida, "OUTPUT_% d.jpg". Isso, no entanto, força-me a renomeá-los manualmente em, e. "IMAGE_A.jpg" depois, o que para esta grande coleção de imagens é muito demorado.

O que eu gostaria de fazer é automaticamente, na lista acima, criar montagens 4x1 nomeadas:

IMAGE_A.jpg
IMAGE_A1.jpg
IMAGE_B.jpg

Idealmente, gostaria de combinar automaticamente todos os "IMAGE_A" em uma montagem de 4x, todos "IMAGE_B" em outro e assim por diante. Cada IMAGE_ [letter] pode ter de 1 a 4 números, por isso não é possível fazer, por exemplo, uma montagem 4x2.

Eu tentei usar% [name] e% f sem sorte e não encontrei nada de útil no manual do ImageMagick ou nas minhas pesquisas no Google.

Eu suspeito que para fazer isso eu teria que usar algum script BASH, mas temo que eu tenha pouco conhecimento para fazer isso sem ajuda.

Agradecemos antecipadamente por qualquer ajuda!

    
por Morgan 11.03.2013 / 16:12

1 resposta

1

Primeiro, colete a lista de nomes de imagens:

ls *jpg | gawk -F_ '{print $2}' | sort | uniq

Agora, passe-os por montage :

ls *jpg | gawk -F_ '{print $2}' | sort | uniq | 
 while read n; do montage *\_$n\_* IMAGE_$n.jpg; done

Isso pressupõe que seus nomes de arquivos não contenham espaços ou outros caracteres estranhos. Não tenho certeza sobre o seu caso "ideal". Se você atualizar sua pergunta para mostrar sua saída "ideal", eu posso trabalhar em algo para você.

Atualização:

Isso eu escrevi um pequeno script Perl deve fazer o que você precisa:

#!/usr/bin/env perl

my %k;             ## declare the hash that will store the image names
while(<>){         ## loop through STDIN
    chomp;         ## remove newline (\n)
    @a=split(/_/); ## split the line on '_' and save as array @a

    ###################################################
    # Since the image names can have varying numbers  #
    # of "_", we want to use the penultimate item in  #
    # the array ($a[$#a-1]) as the image name prefix  #
    ###################################################
    $a[$#a-1]=~s/\d*//g;

    #############################################################
    # Now that we have the prefix ('A' or 'B' in your example), #
    # we will save this image name in the hash of that prefix   #
    #############################################################
    $k{$a[$#a-1]}{$_}=1;
}
## The keys of the hash '%k' are all the prefixes we have found
foreach my $prefix (keys(%k)){
    @images=keys(%{$k{$prefix}});   ## all the images with this prefix

    ## Print the montage command to be executed (testing)
    print "montage @images -title $prefix -tile 4x $prefix.jpg\n";

    ##############################################################
    # If the commands printed above are correct, uncomment this  #
    # line to execute them instead of only printing.             #
    ##############################################################
    #'montage @images -title $prefix -tile 4x $prefix.jpg'
}

Você pode salvá-lo como foo.pl ou o que você preferir e executá-lo assim:

ls *jpg | perl foo.pl

Ou você pode executá-lo como um folheto:

ls *jpg | perl -e 'my %k; while(<>){chomp; @a=split(/_/); $a[$#a-1]=~s/\d*//g; $k{$a[$#a-1]}{$_}=1;} foreach my $prefix (keys(%k)){@images=keys(%{$k{$prefix}}); 'montage @images -title $prefix -tile 4x $prefix.jpg';}'

IMPORTANTE : Este script é muito simples e não funcionará se os nomes dos arquivos contiverem espaços ou outros caracteres estranhos. Estou assumindo que isso não é um problema para você, é relativamente fácil de corrigir, mas torna a sintaxe mais complexa ao redor.

    
por 11.03.2013 / 16:42