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)
Die Datei process-dir.scm
ist in ein Skripte-Verzeichnis von Gimp zu kopieren. Sie wird dann beim Start von Gimp automatisch geladen.
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.
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 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 (
aus zwei Elementen. Wenn save
note
)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
.
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.
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.