Staplelverarbeitung von Bildern mit Graphicsmagkick (composite)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • 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?

  • Staplelverarbeitung von Bildern mit Graphicsmagkick (composite)? Schau mal ob du hier fündig wirst!

    • Hilfreichste Antwort

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

    Wenn du nichts zu sagen hast, sag einfach nichts.

    4 Mal editiert, zuletzt von llutz (24. September 2022 um 15:13)

  • 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.

    Wenn du nichts zu sagen hast, sag einfach nichts.

  • 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.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • 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/".

    Wenn du nichts zu sagen hast, sag einfach nichts.

    Einmal editiert, zuletzt von llutz (24. September 2022 um 16:30)

  • 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):

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • 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')

    Einmal editiert, zuletzt von Chris1893 (25. September 2022 um 11:22) aus folgendem Grund: Falscher bildmodus

  • 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.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!