Staplelverarbeitung von Bildern mit Graphicsmagkick (composite)

  • Hallo zusammen,


    ich stehe gerade absolut auf dem Schlauch. Ich habe X Fotos in einem Ordner. Über diese Bilder würde ich gerne einen Overlay legen. Basisbilder und Overlay haben dabei die gleichen Maße und es sind keine speziellen Optionen notwendig.

    Wenn ich jetzt hergehe und


    Code
    gm composite overlay.png /ordner/*.jpeg /output/*.jpeg

    eingebe bekomm ich nur Fehlermeldungen (Datei *.jpeg does not exist). Was mach ich falsch?

    • New
    • Best Answer

    Versuche mal for bild in ordner/*.jpg ; do gm composite overlay.png "$bild" output/"${bild##*/}" ; done

    Manche werden im Alter weise, manche nur alt.

    Edited 4 times, last by llutz ().

  • Chris1893

    Selected a post as the best answer.
  • Es geht ja um den kompletten Ordnerinhalt. Der * in *.jpeg soll als Platzhalter für alle Dateien im Ordner stehen.

    Die Shell expandiert dein * und übergibt gm eine lange Liste mit Dateinamen, mit der gm nichts anfangen kann. Deswegen die Schleife, die gm die Dateien über die Variable $bild Stück für Stück übergibt.

    Manche werden im Alter weise, manche nur alt.

  • Wobei die Erklärung nicht ganz stimmt, denn wenn man der Shell irgend was mit * drin gibt und eine Fehlermeldung zu einer nicht gefundenen Datei kommt in der der * noch enthalten ist (!), dann gab es schlicht keine Dateien auf die das Muster passte und die Shell hat da nichts expandiert. Das passiert im Beispiel unweigerlich wenn es im Ausgabe-Ordner noch nichts, oder zumindest noch keine JPEG-Dateien gibt, denn dann wird ``/output/*.jpeg`` exakt *so* übergeben, was dann zu der Fehlermeldung führt, weil `composite` alle Dateinamen so wie es dort steht als *Eingabedateien* verarbeiten will. `composite` könnte damit schon was anfangen, macht aber nicht das was gewünscht ist.

    “The intelligence of that creature known as a crowd is the square root of the number of people in it.” — Terry Pratchett, Jingo

  • Versuche mal for bild in /ordner/*.jpeg ; do gm composite overlay.png /ordner/"$bild" /output/"$bild" ; done

    Scheinbar bin ich zu doof. Mit dem Code komm ich leider nicht weiter.

    Ich habe es nochmals mit GM über die Kommandozeile versucht. Jetzt bekomm ich folgende Meldung: gm composite: input images already specified (Dateipfad und -name)

    Was mach ich falsch?

    Gibt es noch eine Möglichkeit über PIL?

  • Ich habe die Schleife oben korrigiert, sie funktioniert hier so für Bilder "*.jpeg" direkt in "ordner/".

    Manche werden im Alter weise, manche nur alt.

    Edited once, last by llutz ().

  • llutz Ich weiss nicht so recht, Zeichenkettenoperationen auf Dateipfaden — das ist klassischerweise eigentlich ein Fall für ``basename``:

    Bash
    for bild in ordner/*.jpeg; do gm composite overlay.png "$bild" output/"$(basename "$bild")"; done

    Chris1893 Falls es sich um viele Bilder handelt und es sich lohnt das auf mehrere Prozessoren/Kerne zu verteilen, ist GNU parallel ein einfacher Weg:

    Bash
    parallel gm composite overlay.png {} output/{/} ::: ordner/*.jpeg

    Und mit `PIL` ginge es so (ungetestet):

    “The intelligence of that creature known as a crowd is the square root of the number of people in it.” — Terry Pratchett, Jingo

  • llutz Ich weiss nicht so recht, Zeichenkettenoperationen auf Dateipfaden — das ist klassischerweise eigentlich ein Fall für ``basename``:

    Bash
    for bild in ordner/*.jpeg; do gm composite overlay.png "$bild" output/"$(basename "$bild")"; done

    Chris1893 Falls es sich um viele Bilder handelt und es sich lohnt das auf mehrere Prozessoren/Kerne zu verteilen, ist GNU parallel ein einfacher Weg:

    Bash
    parallel gm composite overlay.png {} output/{/} ::: ordner/*.jpeg

    Und mit `PIL` ginge es so (ungetestet):

    Der python Ansatz sieht doch schon gut aus. Jetzt muss ich ihn nur noch dazu bringen rgb als farbmodus zu akzeptieren:


    Code
    def main():    with Image.open(OVERLAY_FILE_PATH, mode='rgba')

    Edited once, last by Chris1893: Falscher bildmodus ().

  • Wie soll das denn funktionieren? Wenn Du ein RGB-Bild über ein anderes Bild legst, kannst Du das mit dem anderen Bild gleich sein lassen, denn ein RGB-Bild überdeckt dass dann ja zu 100%. Was genau versuchst Du denn damit zu erreichen?

    “The intelligence of that creature known as a crowd is the square root of the number of people in it.” — Terry Pratchett, Jingo

  • So, bin jetzt mittlerweile an meinen Windows Laptop gewechselt und mache von hier aus weiter.

    Dabei habe ich die Bilder auf meine Fritz.Nas gelegt. Daher jetzt auch geänderte Strukturen. Auf meinem Windows Laptop läuft pycharm. PIL ist natürlich installiert.

    Hier mein Code jetzt:

    Ein Ergebnis bekomm ich aber nicht wirklich.

    Bis auf

    C:\Users\Windows\PycharmProjects\Test\venv\Scripts\python.exe "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1\plugins\python-ce\helpers\pydev\pydevconsole.py" --mode=client --port=53631

    import sys; print('Python %s on %s' % (sys.version, sys.platform))

    sys.path.extend(['C:\\Users\\Windows\\PycharmProjects\\Test', 'C:/Users/Windows/PycharmProjects/Test'])

    PyDev console: starting.

    Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:04:45) [MSC v.1900 32 bit (Intel)] on win32

    runfile('C:/Users/Windows/Documents/batch1.py', wdir='C:/Users/Windows/Documents/')

    kommt da nichts. Auch keine Bilder in

    Code
    \\fritz.box\\FRITZ.NAS\\Intenso-USB3-0Device-01\\Fotosoutput

    ;)

  • Chris1893 Wird das überhaupt ausgeführt? Ich würde da Fehlermeldungen erwarten. Lies Dir beispielsweise mal die Dokumentation zu `PIL.Image.open()` durch, speziell was `mode` da bedeutet und welche(n) Wert(e) das annehmen kann/darf.


    Dann gibt es die Pfade da alle nicht. "\\" ist *ein* Backslash:

    Python
    In [278]: len("\\")
    Out[278]: 1
    
    In [279]: print("\\")
    \

    Also entweder entsprechend viele \ angeben, oder das als ”rohe” Zeichenkette mit ``r`` angeben, damit \ in der literalen Zeichenkette keine besondere Bedeutung mehr hat.


    Das heisst das erste `Image.open()` muss schon mit einem `FileNotFoundError` abbrechen.


    Auch die ``for``-Schleife läuft nicht über ein nicht-existierendes Verzeichnis.


    Was macht denn das `mode`-Argument bei `PIL.Image.Image.alpha_composite()`? Was steht denn zum `mode`-Argument in der Dokumentation?


    Letztlich wirst Du vorm überlagern alle beteiligten Bilder in RGBA konvertieren müssen, und dann vorm Speichern das Ergebnis wieder in RGB, weil JPEG keine Transparenz kennt. Das bekommt man aber nicht durch raten hin, oder durch hinzufügen von Code von dem man glaubt, der macht dann schon auf magische Weise was man möchte. Der Rechner macht immer nur das was man ihm sagt, nicht was man eigentlich meinte.

    “The intelligence of that creature known as a crowd is the square root of the number of people in it.” — Terry Pratchett, Jingo