使用Imagemagick以2个为一组批量附加图像

时间:2017-11-21 17:23:57

标签: imagemagick

我有一个图像目录,需要以两个为一组水平合并这些图像,然后将每个图像的输出保存到新的图像文件中:

image-1.jpeg
image-2.jpeg
image-3.jpeg
image-4.jpeg
image-5.jpeg
image-6.jpeg

通过命令行使用Imagemagick,有没有办法遍历目录中的每个其他图像并运行magick convert image-1.jpeg image-2.jpeg +append image-combined-*.jpg

所以结果将是成对的图像组合:

image-1.jpeg image-2.jpeg -> image-combined-1.jpg
image-3.jpeg image-4.jpeg -> image-combined-2.jpg
image-5.jpeg image-6.jpeg -> image-combined-3.jpg

5 个答案:

答案 0 :(得分:3)

将所有内容简洁地与 GNU Parallel 并行地实现,并实际使用您支付的所有可爱的CPU内核 Intel

parallel -N2 convert {1} {2} +append combined-{#}.jpeg ::: *jpeg

其中:

  • -N2说要一次拿两个文件
  • {1}{2}是前两个参数
  • {#}是顺序作业号,
  • :::划分参数的开始

如果您的CPU有8个内核, GNU Parallel 将一次运行8 converts,除非您通过添加-j4一次指定4个作业。

如果您正在学习并且只是通过 GNU Parallel 添加:

  • --dry-run所以你可以看到它在没有实际做任何事情的情况下会做什么
  • -k保持输出顺序

所以,我的意思是:

parallel --dry-run -k -N2 convert {1} {2} +append combined-{#}.jpeg ::: *jpeg

示例输出

convert image-1.jpeg image-2.jpeg +append combined-1.jpeg
convert image-3.jpeg image-4.jpeg +append combined-2.jpeg
convert image-5.jpeg image-6.jpeg +append combined-3.jpeg

macOS 上,您只需安装 GNU Parallel 即可:

brew install parallel

如果您有数千或数十万个文件,则可能会遇到错误Argument list too long - 尽管这在macOS上非常罕见,因为限制为262,144个字符:

sysctl -a kern.argmax
kern.argmax: 262144

如果发生这种情况,您可以使用此语法来管道 GNU Parallel 中的文件名:

find /somewhere -iname "*.jpeg" -print0 | parallel -0 -N2 convert {1} {2} +append combined-{#}.jpeg

答案 1 :(得分:1)

使用ImageMagick可以轻松编写脚本。我可以告诉你如何在Unix中。但是如果你有超过9个图像,那么你可能需要用前导零重命名,因为按字母顺序排列图像-10将出现在图像2之前。您没有提到您的IM版本或平台,脚本将根据操作系统而有所不同。

这是一个Unix解决方案。我在桌面上的文件夹测试中有图像rose-01.jpg ... rose-06.jpg(Mac OSX)。每个图像下面都有一个带有文件名的标签,以便我们可以跟踪文件。

cd
cd desktop/test
arr=(`ls *.jpg`)
num=${#arr[*]}
for ((i=0; i<num; i=i+2)); do
j=$((i+1))
k=$((i+2))
magick ${arr[$i]} ${arr[$j]} +append newimage_${j}_${k}.jpg
done

请注意,数组以索引0开头。所以我使用j = i + 1和k = i + 2作为对应于数组中ls的文件名中1,2 3,4,5,6的图像。 / p>

结果是(newimage_1_2.jpg,newimage_3_4.jpg,newimage_5_6.jpg)

enter image description here

enter image description here

enter image description here

答案 2 :(得分:1)

如果图像的大小和方向都相同,并且您的系统有内存可以读取目录中的所有图像,则可以像这样简单地完成...

magick *.jpeg -set option:doublewide %[fx:w*2] \
   +append +repage -crop %[doublewide]x%[h] +repage image-combined-%02d.jpg

答案 3 :(得分:0)

另一种解决方案是将所有图像作为2x3的数组以2×2的形式进行蒙太奇,然后将它们垂直地分成3个部分。所以在ImageMagick中,这也有效,因为这些图像的大小都相同。

cd
cd desktop/test
arr=(`ls *.jpg`)
num=${#arr[*]}
num2=`magick xc: -format "%[fx:ceil($num/2)]" info:`
magick montage ${arr[*]} -tile 2x -geometry +0+0 miff:- | magick - -crop 1x3@ +repage newimage.jpg


结果是:newimage-0.jpg,newimage-1.jpg,newimage-2.jpg

enter image description here

enter image description here

enter image description here

答案 4 :(得分:0)

Ole Tang写道:

  

文件名失败,例如My summer photo.jpg

所以这是使用ImageMagick从原始帖子修改的解决方案。

图片:

rose 1.png rose 2.png rose 3.png rose 4.png rose 5.png rose 6.png

OLDIFS=IFS
IFS=$'\n'
arr=(`ls *.png`)
for ((i=0;i<6;i++)); do
echo "${arr[$i]}"
done
IFS=OLDIFS
num=${#arr[*]}
for ((i=0; i<num; i=i+2)); do
j=$((i+1))
k=$((i+2))
magick "${arr[$i]}" "${arr[$j]}" +append newimage_${j}_${k}.jpg
done

这会产生:

newimage_1_2.jpg newimage_3_4.jpg newimage_5_6.jpg