使用Imagemagick以两人一组的方式批附加图像

使用Imagemagick以两人一组的方式批附加图像,imagemagick,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 composed-*.jpg 因此,结果将是图像对的组合:

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

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 composed-*.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

可以使用ImageMagick轻松编写脚本。我可以向您演示如何使用Unix。但是,如果您有9个以上的图像,那么您可能必须使用前导零重命名,因为按字母顺序排列,image-10将位于image-2之前。您没有提到您的IM版本或平台,脚本编写将因操作系统而异

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

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
cd
cd桌面/测试
arr=(`ls*.jpg`)
num=${#arr[*]}

对于((i=0;i而言,另一种解决方案是将所有图像以2x3数组的形式两个接两个地拼接在一起,然后将它们平均地垂直裁剪成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


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

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

将它们简洁地添加到GNU parallel中,并与GNU parallel并行,然后实际使用您为英特尔支付的所有可爱的CPU内核

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

  • -N2
    表示一次获取两个文件
  • {1}
    {2}
    是前两个参数
  • {#}
    是顺序作业编号,并且
  • 标定参数的开始
如果您的CPU有8个内核,GNU Parallel将同时运行8个
转换
,除非您通过添加
-j4
指定一次4个作业


如果您正在学习并正在使用GNU Parallel找到自己的方法,请添加:

  • --试运行
    ,这样您就可以看到它会做什么,而无需实际执行任何操作
  • -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

如果您有数千个或数十万个文件,则可能会遇到错误
参数列表太长
——尽管这在macOS上非常罕见,因为限制为262144个字符:

sysctl -a kern.argmax
kern.argmax: 262144
如果发生这种情况,您可以使用此语法在GNU Parallel中管道传输文件名:

find /somewhere -iname "*.jpeg" -print0 | parallel -0 -N2 convert {1} {2} +append combined-{#}.jpeg
唐英年写道:

在诸如My summer photo.jpg之类的文件名上失败

下面是使用ImageMagick的解决方案,它是从我的原始帖子中修改过来的

图像:

玫瑰1.png 玫瑰2.png 玫瑰3.png 玫瑰4.png 玫瑰色5.png 玫瑰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
OLDIFS=IFS
IFS=$'\n'
arr=(`ls*.png`)

为了((i=0;我想知道哪个映像与哪个映像配对有什么关系?您的操作系统可能很重要!啊,是的,我在OSX上。是的,映像需要以两个一组的顺序配对。在向映像添加前导零后,这非常有效。我主要想知道Imagemagick是否提供了任何迭代器函数来处理此问题,但您的解决方案非常简单。T如果你喜欢我的答案,请考虑投票。我不相信命令行IMAGEMGEKE支持一个迭代器。但是API的一个可能。不幸的是,我只使用命令行模式。<代码>查找< /C> >将在<代码> /某处< /代码>中递归搜索。如果你只想要当前DIR:<代码> Prtff '%s' 0’*并行…< /代码> thi。s之所以工作,是因为
printf
是一个内置函数,不必遵守argmax限制。嗨,马克,如果它不是一对两张图片,而是一组大约234张图片的18张后续图片(第一张图片从图片1到18,第二张图片从图片19到36,依此类推),我如何使用上面的酷命令,这样我总共可以得到13张合影,每张合影包含18张这组照片?