根据输入文件自动命名蒙太奇的输出

根据输入文件自动命名蒙太奇的输出

我有一个文件夹,其中的图像分为不同的频道:

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

我现在正在使用蒙太奇制作 4x1 图片,然后将其命名为“OUTPUT_%d.jpg”。然而,这迫使我事后手动将它们重命名为例如“IMAGE_A.jpg”,这对于如此大的图像集合来说非常耗时。

我想要做的是从上面的列表中自动创建名为 4x1 的蒙太奇:

IMAGE_A.jpg
IMAGE_A1.jpg
IMAGE_B.jpg

理想情况下,我希望自动将所有“IMAGE_A”组合成 4x 蒙太奇,将所有“IMAGE_B”组合成另一个蒙太奇,依此类推。每个 IMAGE_[字母] 可以有 1-4 个数字,因此不可能简单地制作 4x2 蒙太奇。

我尝试使用 %[name] 和 %f,但没有成功,并且在 ImageMagick 手册或我的谷歌搜索中也没有找到任何有用的信息。

我怀疑要做到这一点我必须使用一些 BASH 脚本,但我担心如果没有帮助我的知识就无法做到这一点。

提前感谢你的帮助!

答案1

首先,收集图像名称列表:

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

现在,将它们传递下去montage

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

这假设您的文件名不包含空格或其他奇怪字符。我不确定您的“理想”情况。如果您更新问题以显示您的“理想”输出,我应该能够为您解决问题。


更新:

我编写了一个很小的 ​​Perl 脚本,可以满足您的需要:

#!/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`
}

您可以将其保存为foo.pl或任何您喜欢的内容并像这样运行它:

ls *jpg | perl foo.pl

或者你可以将其作为一行程序运行:

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`;}'

重要的:此脚本非常简单,如果您的文件名包含空格或其他奇怪字符,它将无法运行。我假设这对您来说不是问题,它相对容易修复,但会使语法整体变得更加复杂。

相关内容