我有一个文件夹,其中的图像分为不同的频道:
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`;}'
重要的:此脚本非常简单,如果您的文件名包含空格或其他奇怪字符,它将无法运行。我假设这对您来说不是问题,它相对容易修复,但会使语法整体变得更加复杂。