我有一个图像目录,需要以两个为一组水平合并这些图像,然后将每个图像的输出保存到新的图像文件中:
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
答案 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)
答案 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
答案 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