【问题标题】:Batch append images in groups of two with Imagemagick使用 Imagemagick 以两个为一组批量附加图像
【发布时间】:2018-05-05 06:26:54
【问题描述】:

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

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

【问题讨论】:

  • 哪个图像与哪个图像配对有关系吗?您的操作系统可能很重要!
  • 啊,是的,我在 OSX 上。是的,图像需要按两个一组顺序配对。

标签: imagemagick


【解决方案1】:

Ole Tang 写道:

在像 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

这会产生:

newimage_1_2.jpg newimage_3_4.jpg newimage_5_6.jpg

【讨论】:

    【解决方案2】:

    用 GNU Parallel 简洁地将它们全部附加并实际使用您支付 Intel 购买的所有可爱的 CPU 内核!

    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
    

    在 ma​​cOS 上,您可以简单地安装 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
    

    【讨论】:

    • find 将在/somewhere 中递归搜索。如果您只想要当前目录:printf '%s\0' * | parallel ...。这是因为printf 是一个内置函数,不必遵守 argmax 限制。
    • 嗨马克,如果不是两张图片的一对,而是大约234张图片的一组18张后续图片,我怎么能使用上面的酷命令(所以从图片1到第一个组合图片18,然后是图 19 到 36 中的第二张,以此类推),这样我总共会得到 13 张组合图片,每张包含 18 张集合的图片?
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这可以使用 ImageMagick 轻松编写脚本。我可以告诉你如何在 Unix 中。但是如果您有超过 9 张图像,那么您可能必须使用前导零重命名,因为按字母顺序 image-10 将位于 image-2 之前。您没有提及您的 IM 版本或平台,并且脚本会因操作系统而异。

      这是一个 Unix 解决方案。我在桌面(Mac OSX)的文件夹测试中有图像rose-01.jpg ... 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
      

      请注意,数组从索引 0 开始。所以我使用 j=i+1 和 k=i+2 来表示数组中 ls 的文件名中对应于 1,2 3,4 5,6 的图像。

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

      【讨论】:

      • 在我的图像中添加前导零后效果很好。我主要是好奇 Imagemagick 是否提供了任何迭代器函数来处理这个问题,但您的解决方案非常简单。谢谢!
      • 如果您喜欢我的回答,请考虑投票。我不相信命令行 ImageMagick 支持迭代器。但是 API 的一种可能。不幸的是,我只使用命令行模式。
      【解决方案5】:

      另一种解决方案是将所有图像以 2×3 的数组 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

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 2011-02-08
        • 2021-09-21
        • 1970-01-01
        • 2013-12-30
        相关资源
        最近更新 更多