process-dir.scm


Beschreibung

process-dir.scm dient zur Verarbeitung aller Bilddateien in einem Verzeichnis mit Gimp. Im ersten Schritt wird das erste Bild geöffnet, in den nächsten Schritten wird die geöffnete Bild geschlossen und das nächste Bild geöffnet, im letzen Schritt wird das letzte Bild geschlossen. Nach dem Öffnen und vor dem Schließen einer Bilddatei wird eine Prozedur aufgerufen, die in einem anderen Skript definiert werden muss. process-dir.scm kann also nur zusammen mit einem anderen Skript sinnvoll benutzt werden. Ein Beispiel für ein solches anderes Skript ist select-dir.scm (Quelle)

Einrichtung

Die Datei process-dir.scm ist in ein Skripte-Verzeichnis von Gimp zu kopieren. Sie wird dann beim Start von Gimp automatisch geladen.

Prozeduren

(de-herbaer-split-string-at-last str chr)

Das Ergebnis ist eine Liste aus zwei Zeichenketten, deren Verkettung str ergibt.

Wenn das Zeichen chr in str nicht vorkommt, dann ist die zweite Zeichenkette des Ergebnisses leer.

Sonst kommt das Zeichen chr in der zweiten Zeichenkette des Ergebnisses genau einmal am Anfang vor.

Diese Prozedur dient dazu, einen Dateinamen in einen Basisnamen und ein Suffix zu zerlegen.

(de-herbaer-set-suffix name sfx max-sfxlen)

name und sfx sind Zeichenketten, max-sfxlen ist eine natürliche Zahl. Die Zeichenkette sfx darf nicht leer sein.

Das erste Zeichen von sfx (normalerweise .) grenzt ein Suffix in name vom Basisnamen ab. Die Prozedur de-herbaer-split-string-at-last zerlegt name in einen Basisnamen und ein Suffix. Wenn der Basisname nicht leer ist und das Suffix nicht länger als max-sfxlen ist, ist das Ergebnis die Verkettung des Basisnamens und sfx, sonst die Verkettung von name und sfx.

(de-herbaer-process-dir dir-in dir-out replace imgfunc)

Diese Prozedur startet die Verarbeitung der Bilder im Verzeichnis dir-in. Sie speichert die nötigen Daten, insbesondere die Namen der Bilddateien, und ruft dann die Prozedur script-fu-de-herbaer-process-dir auf.

Im Verzeichnis dir-out werden die bearbeiteten Bilder gespeichert. Der Dateiname bleibt gleich.

Wenn replace den Wert #f annimmt, wird ein Name einer gewöhnlichen Datei im Verzeichnis dir-in nur dann in die Liste aufgenommen, wenn im Verzeichnis dir-out nicht eine Datei mit dem gleichen Namen existiert.

Die Prozeduren zum Zugriff auf das Dateisystem (dir-open-stream, dir-read-entry, dir-close-stream, file-type, file-exists?) sind in der FTX-Erweiterung zu TinyScheme definiert.

(script-fu-de-herbaer-process-dir)

Diese Prozedur schließt eine geöffnete Bilddatei und öffnet gegebenenfalls die nächste Datei in der Liste. Es ist nützlich, dieser Funktion eine Tastenkombination zuzuordnen.

Wenn die gespeicherten Kennungen eines Bildes und einer Ebene (display) gültig sind, dann wird die Verarbeitungsprozedur mit der Kennung des Bildes und dem Wert 1 als Parametern aufgerufen. Abhängig vom Ergebnis werden das Bild und eine Textdatei im Verzeichnis dir-out gespeichert. Die Anzeige des Bildes wird geschlossen und der Dateiname des Bildes aus der Liste entfernt.

Wenn die Dateiliste dann leer (()) ist, wird () als Verarbeitungsstand gespeichert. Die Verarbeitung ist abgeschlossen.

Andernfalls wird die erste Bilddatei der Liste geöffnet und die aktuellen Werte gespeichert. Die Verarbeitungsprozedur wird mit der Kennung des Bildes und dem Wert 0 als Parametern aufgerufen. Wenn das Ergebnis nicht #f ist, wird gleich wieder diese Prozedur script-fu-de-herbaer-process-dir „tail-recursive” aufgerufen. Sonst bleibt das Bild zur Bearbeitung geöffnet, und zum Abschluss und zur Bearbeitung des nächsten Bildes wird script-fu-de-herbaer-process-dir (zum Beispiel) über eine Tastenkombination aufgerufen.

Der Verarbeitungsstand

Ich speichere den Stand der Verarbeitung in einer Datei mit dem Namen de_herbaer_process_dir im Gimp-Verzeichnis (gimp-directory, in meinem Falle ~/.gimp-2.8)

Zunächst versuchte ich, den Verarbeitungsstand als „Parasit” zu speichern, aber das scheiterte an Fehlern in der Prozedur open-output-string.

Der Dateiinhalt ist die geschriebene Darstellung der leeren Liste () oder einer Scheme-Form, die folgendermaßen aufgebaut ist:

   (imgfunc image display dir-in dir-out files)
  

Die Auswertung von imgfunc ergibt die Verarbeitungsprozedur. Eine Prozedur hat keine geschriebene Darstellung, die sich einfach wieder lesen läßt. Deshalb ist der Wert typischerweise ein Symbol, dessen Wert die Verarbeitungsprozedur ist. imgfunc kann auch eine lambda-Form sein.

image ist die Kennung des geöffneten Bildes oder zu Anfang -1.

display ist die Kennung der Anzeige des geöffneten Bildes oder zu Anfang -1.

dir-in ist der Pfad des Verzeichnisses der Originalbilder (Eingabeverzeichnis)

dir-out ist der Pfad des Verzeichnisses, in dem die bearbeiteten Bilder und möglicherweise zusätzliche Textdateien gespeichert werden.

files ist eine Liste der Namen der noch zu verarbeitenden Bilddateien im Verzeichnis dir-in.

Ein typischer Beispiel-Wert ist

(de-herbaer-select-dir 12 1 "/bilder/original" "bilder/bearbeitet" ("bild_1.jpg" "bild_2.jpg"))
  

Wenn jetzt 12 eine gültige Bild-Kennung und 1 eine gültige Anzeige-Kennung sind, dann sollte bild_1.jpg geöffnet sein. Beim nächsten Aufruf von script-fu-de-herbaer-process-dir wird das bearbeitete Bild (normalerweise) gespeichert und das nächste Bild bild_2.jpg geöffnet. Andernfalls wird das Bild bild_1.jpg geöffnet. Wenn viele Bilder zu verarbeiten sind, kann man zwischenzeitlich Gimp beenden und die Verarbeitung am nächsten Tag fortsetzen.

Das Skript select-dir.scm (Quelle) definiert die Prozedur de-herbaer-select-dir als Beispiel einer Verarbeitungsprozedur.

Die Verarbeitungsprozedur

Die Verarbeitungsprozedur wird mit der Kennung des Bildes und einem weiteren Parameter step aufgerufen. step kann die Werte 0 oder 1 annehmen.

Wenn step den Wert 0 hat, ist das Bild neu geöffnet. Das Ergebnis #f zeigt an, dass das Bild zur interaktiven Bearbeitung geöffnet bleibt. Die Verarbeitungsprozedur kann hier einige vorbereitende Schritte der Bildverarbeitung vornehmen. Bei einem anderen Ergebnis wird gleich script-fu-de-herbaer-process-dir für den nächsten Verarbeitungsschritt aufgerufen.

Wenn step den Wert 1 hat, wird die Bilddatei geschlossen. Die Verarbeitungsprozedur kann zuvor einige abschließende Schritte der Bildverarbeitung vornehmen. Das Ergebnis ist eine Liste (save note) aus zwei Elementen. Wenn save #f ist, wird die Datei nicht gespeichert, aber bei jedem anderen Wert.

Wenn note nicht einer der Werte #f, () oder "" ist, wird eine Textdatei in das Verzeichnis dir-out geschrieben. Wenn note eine Zeichenkette ist, hat die Textdatei den Namen der Bilddatei mit dem Suffix .note. Die Zeichenkette wird in die Textdatei geschrieben. Andernfalls wird die geschriebene Darstellung von note in die Textdatei geschrieben. Der Name der Textdatei ist der Name der Bilddatei mit dem Suffix .scm.

Registrierung und Menüeintrag

Die Registrierung in der Prozedur-Datenbank erlaubt es, der Prozedur script-fu-de-herbaer-process-dir eine Tastenkombination zuzuordnen. Sie hilft auch anderen Gimp-Anwendern, die Prozedur zu finden. Ich benutze die Tastenkombination Ctrl+Alt+W.

Der Eintrag im Menü (Fiter → Verzeichnis → Weiter) hilft Leuten wie mir, die Tastenkombinationen schnell vergessen.

Schwachpunkte

Die Prozedur de-herbaer-process-dir nimmt alle Dateien im Quellverzeichnis dir-in in die Dateiliste auf. Man kann die Dateiliste auf Dateien mit bekannten Namensendungen für Bilddateien (z.B. .jpg) beschränken.

Unterverzeichnissse werden übergangen.