如何通过随机分层源图像自动生成合成图像?

时间:2014-12-23 09:57:58

标签: image-processing scripting imagemagick photoshop

我正在开发个人创意项目,需要帮助查找或创建一个脚本,该脚本将从4个不同的文件夹中随机选择4个图像,堆叠它们并创建一系列png合成图像作为输出。如果可以将每个文件夹的图像分配到固定图层,则可以使用额外点(例如,“背景”文件夹中的图像将始终显示在后面)。 注意:我不知道如何编码。

1 个答案:

答案 0 :(得分:2)

<强>更新

好的,我已按如下方式更新了脚本:

  1. 它会生成10个输出文件 - 您可以通过在开始时更改NFILES来更改它
  2. 输出文件在运行之间不会互相覆盖,下一个免费名称将从output-0.png开始使用,然后output-1.png,依此类推。
  3. 我已更正了alpha合成以匹配您的文件。
  4. 脚本跟随......

    #!/bin/bash
    
    # Number of output files - edit freely :-)
    NFILES=10
    
    # Build arrays of filenames in each layer, assume directories are "Layer0", "Layer1" etc
    IFS=$'\n' L0files=($(find "Layer 0" -name "*.png"))
    IFS=$'\n' L1files=($(find "Layer 1" -name "*.png"))
    IFS=$'\n' L2files=($(find "Layer 2" -name "*.png"))
    IFS=$'\n' L3files=($(find "Layer 3" -name "*.png"))
    
    # Produce NFILES output files
    for i in `seq 1 $NFILES`; do
    
       # Choose random index into each array of filenames
       index0=$( jot -r 1  0 $((${#L0files[@]} - 1)) )
       index1=$( jot -r 1  0 $((${#L1files[@]} - 1)) )
       index2=$( jot -r 1  0 $((${#L2files[@]} - 1)) )
       index3=$( jot -r 1  0 $((${#L3files[@]} - 1)) )
    
       # Pick up files as specified by the random index
       f0=${L0files[index0]}
       f1=${L1files[index1]}
       f2=${L2files[index2]}
       f3=${L3files[index3]}
    
       # Generate output filename, "output-nnn.png" 
       # ... where nnn starts at 0 and goes up till no clash
       i=0
       while :; do
          out="output-$i.png"
          [ ! -f "$out" ] && break
          ((i++))
       done
    
       echo $f0, $f1, $f2, $f3 "=> $out"
       convert "$f0" "$f1" -composite "$f2" -composite "$f3" -composite "$out"
    done
    

    从Layer [0-3]目录中的以下图像开始:

    第0层

    enter image description here

    第1层

    enter image description here

    第2层

    enter image description here

    第3层

    enter image description here

    生成如下输出文件:

    enter image description here

    原始答案

    我会安装ImageMagick来执行此操作 - 如果您首先通过here安装homebrew,它可以免费并轻松安装在OSX上。然后在终端中键入以下内容。

    brew install imagemagick
    

    该脚本将如下所示:

    #!/bin/bash
    # Build arrays of filenames in each layer, assume directories are "Layer0", "Layer1" etc
    IFS=$'\n' L0files=($(find "Layer0" -name "*.png"))
    IFS=$'\n' L1files=($(find "Layer1" -name "*.png"))
    IFS=$'\n' L2files=($(find "Layer2" -name "*.png"))
    IFS=$'\n' L3files=($(find "Layer3" -name "*.png"))
    
    # Choose random index into each array of filenames
    index0=$( jot -r 1  0 $((${#L0files[@]} - 1)) )
    index1=$( jot -r 1  0 $((${#L1files[@]} - 1)) )
    index2=$( jot -r 1  0 $((${#L2files[@]} - 1)) )
    index3=$( jot -r 1  0 $((${#L3files[@]} - 1)) )
    
    # Pick up files as specified by the random index
    f0=${L0files[index0]}
    f1=${L1files[index1]}
    f2=${L2files[index2]}
    f3=${L3files[index3]}
    
    echo Overlaying $f0, $f1, $f2, $f3 to produce "result.png"
    convert "$f0" "$f1" "$f2" "$f3" -compose over -composite result.png
    

    因此,您可以将上述内容保存为generate,然后转到终端并执行以下操作以使其可执行

    chmod +x generate
    

    然后您可以通过在Finder中双击其图标或键入:

    来运行它
    ./generate
    
    终端中的

    然后,它将生成4个图像的随机叠加,每个文件夹一个,并将结果保存为result.png

    您需要根据图像所在的各个层编辑前4行 - 基本上我假设图像位于名为Layer0-4的目录中,但您的图像可能位于/Users/FreddyFrog/pictures/backgrounds或某些人,在这种情况下你会编辑

        IFS=$'\n' L0files=($(find "/Users/FreddyFrog/pictures/backgrounds" -name "*.png"))
    

    当我在Mac上运行几次时,我得到:

    Overlaying Layer0/l0-5.png, Layer1/l1-0.png, Layer2/l2-3.png, Layer3/l3-3.png to produce result.png
    Overlaying Layer0/l0-3.png, Layer1/l1-4.png, Layer2/l2-3.png, Layer3/l3-3.png to produce result.png