2014-12-23 40 views
2

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

+0

你是一个像样的操作系统,如Linux或OSX?如果图像大小不同 - 重新缩放至固定大小? –

+0

感谢您的回答。我正在使用OSX,我的源图像都是png,并且alpha通道保存在最终大小,所以不需要进行更改。最终的图像应该有4层,我有一组图像为每个单独的文件夹上的图层。 – ign

回答

2

更新

好吧,我已经更新如下脚本:

  1. 它产生10个输出文件 - 你可以在开始改变NFILES
  2. 输出文件进行更改会在运行之间不会相互覆盖,下一个免费名称将用于从output-0.png开始,然后是output-1.png等等。
  3. 我已更正了alpha合成以匹配您的文件。

脚本如下...

#!/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 

与层下面的图像以[0-3]目录:

层0

enter image description here

第1层

enter image description here

二层

enter image description here

三层

enter image description here

像下面的输出文件是p roduced:

enter image description here

原来的答案

我会安装ImageMagick的做到这一点 - 它是免费的,在OSX上轻松安装,如果你安装homebrew首先要here。然后在终端中键入以下内容。

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 
+0

谢谢你的详细解答@Mark,这似乎是解决主要任务。虽然透明胶片的渲染方式存在问题,但我一次只能看到2个图层,而我的平面色彩背景似乎覆盖了最前面的图像。
因为我需要多次运行脚本,我怎样才能避免结果被覆盖,我怎么能让它发挥,也许让我们说每次运行它10次? – ign

+0

我不在我的Mac一段时间。你能发布每个图层的图片和你的预期结果吗?或者点击我的个人资料并发送电子邮件以及结果应该如何显示。当我回家时,我可以解决所有问题。 –

+0

再次感谢。我已经上传了一个4层的样本和一个示例结果图片[here](http://we.tl/MKIpQvKwXd) – ign