[FIXED] Wie kann ich automatisch zusammengesetzte Bilder generieren, indem ich Quellbilder zufällig überlagert?

Ausgabe

Ich arbeite an einem persönlichen kreativen Projekt und brauche Hilfe beim Finden oder Erstellen eines Skripts, das zufällig 4 Bilder aus 4 verschiedenen Ordnern auswählt, sie stapelt und eine Reihe von zusammengesetzten PNG-Bildern als Ausgabe erstellt. Extrapunkte, wenn die Bilder jedes Ordners einer festen Ebene zugeordnet werden können (so erscheinen zB Bilder aus dem Ordner „Hintergründe“ immer hinten). Hinweis: Ich kann nicht codieren.

Lösung

Aktualisiert

Ok, ich habe das Skript wie folgt aktualisiert:

  1. Es erzeugt 10 Ausgabedateien – Sie können es ändern, indem Sie NFILES am Anfang ändern
  2. Die Ausgabedateien überschreiben sich zwischen den Durchläufen nicht, es wird der nächste freie Name verwendet, beginnend mit output-0.pngdann output-1.pngund so weiter.
  3. Ich habe das Alpha-Compositing korrigiert, damit es zu Ihren Dateien passt.

Skript folgt…

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

Beginnen Sie mit den folgenden Bildern in Ihren Layer[0-3]-Verzeichnissen:

Schicht 0

Geben Sie hier die Bildbeschreibung ein

Schicht 1

Geben Sie hier die Bildbeschreibung ein

Schicht 2

Geben Sie hier die Bildbeschreibung ein

Schicht 3

Geben Sie hier die Bildbeschreibung ein

Ausgabedateien wie die folgenden werden erzeugt:

Geben Sie hier die Bildbeschreibung ein

Ursprüngliche Antwort

Ich würde dazu ImageMagick installieren – es ist kostenlos und einfach unter OSX zu installieren, wenn Sie es homebrewzuerst hier installieren . Geben Sie dann im Terminal Folgendes ein.

brew install imagemagick

Das Skript sähe dann so aus:

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

Sie würden also das Obige als speichern generateund dann zum Terminal gehen und Folgendes einmal tun, um es ausführbar zu machen

chmod +x generate

Dann können Sie es ausführen, indem Sie im Finder auf das Symbol doppelklicken oder Folgendes eingeben:

./generate

im Terminal. Es erzeugt dann eine zufällige Überlagerung von 4 Bildern, eines aus jedem Ordner, und speichert das Ergebnis als result.png.

Sie müssen die ersten 4 Zeilen bearbeiten, je nachdem, wo sich Ihre Bilder für die verschiedenen Ebenen befinden – im Grunde genommen gehe ich davon aus, dass sich die Bilder in Verzeichnissen mit dem Namen befinden Layer0-4, aber Ihre befinden sich möglicherweise in /Users/FreddyFrog/pictures/backgroundsoder so, in diesem Fall würden Sie sie bearbeiten

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

Wenn ich es ein paar Mal auf meinem Mac ausführe, erhalte ich:

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


Beantwortet von –
Mark Setchell


Antwort geprüft von –
Mildred Charles (FixError Admin)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like