Grundlagen

Als erstes einige Grundlagen.
Jede Script-Fu(Scheme) Funktion werden in runde Klammern eingefasst. Der erste Ausdruck innerhalb der runden Klammern kann eine Funktion, ein Operator, Einleitung einer Schleife u.s.w sein, nachfolgend sind die dazugehörigen Argumente,Faktoren b.z.w Parameter.

(gimp-image-new 100 100 RGB)

( + 6 2) = 8

( + (- 6 2) (- 7 3)) = 8

(if ( = a b)

(...)

)

Variablen können global definiert werden. Diese global definierten Variablen sind bis zum Beenden des Scriptes gültig.

(define zahl 6) ;;zahl = 6
(define text "Hallo Welt") ;;text = "Hallo Welt"

Möchten sie den Wert der Variable "zahl" verändern nachdem die Variable mit define b.z.w let ,let* u.s.w deklariert wurde, können sie das wie folgt tun.

(set! zahl 8) ;;zahl = 8
(set! text "Hallo Berlin") ;;text = "Berlin"

Lokale Variablen werden wie folgt definiert und sind nur innerhalb der rot gekennzeichneten Klammern gültig. Innerhalb des grün gekennzeichneten Bereiches werden die Variablen definiert. Lokale Variablen können natürlich mit Hilfe von set! einen neuen Wert zugewiesen bekommen.

(let*(
(sizeX 100)
(sizeY 200)
)
(img (car (gimp-image-new sizeX sizeY RGB)))
...
)

Um mehrere Werte zu speichern und diese zu gegebener Zeit abzurufen, werden Listen genutzt.
Diese Listen werden wie folgt definiert.

(set! weinrot ''(231 37 136))

Listen in Scheme bestehen aus Listenkopf(das erste Element) und Listenende(Rest). Mittels car greift man auf den Listenkopf und mittels cdr auf das Listenende zu.

(car weinrot) =231 (cdr weinrot) = (37 136) (car (cdr(cdr weinrot))) = 136

Mit Hilfe von Listen greift man auf jeden einzelnen Wert die eine Funktion ausgibt und kopiert sie in die jeweilige Variable. Zum Beispiel die Funktion "(gimp-drawable-offsets)" gibt die x und y Koordinate eines Drawables zurück. So kann man mittels car auf den ersten Wert x und mittels cdr auf den zweiten Wert y zugreifen.

(let*
(
(coordinate_x (car (gimp-drawable-offsets)))
(coordinate_y (cdr (gimp-drawable-offsets)))
)

Diese Angaben zu den Variablen, Operationen, Listen u.s.w können auch über die Script-Fu Console(Filter->Script-Fu->Script-Fu Console) überprüft werden.
Das waren einige Grundlagen zu Script-Fu(Scheme). Wer weitere Informationen zu Script-Fu(Scheme) wünscht, sollte sich den "Links" Bereich dieser Homepage ansehen.

Beispielskript

Im wesentlichen gibt es zwei Bereiche bei Scripten in Gimp. Das ist zum einem der Registrierbereich(grün,orange) und zum anderen der Funktionsbereich(Rest).

  1. ; *******************************************
  2. ; * Klaus Harrer 10/30/04 after-expose *
  3. ; *******************************************
  4. (define (script-fu-after-expose image layer0)
  5. (gimp-undo-push-group-start image)
  6. (let*
  7. (
  8. (cp-layer (car (gimp-layer-copy layer0 1)))
  9. ; ab gimp-2.4 Vorwärtsdeklaration nötig
  10. (layer-mask)
  11. (floating-sel)
  12. )
  13. (gimp-image-add-layer image cp-layer -1)
  14. (gimp-desaturate cp-layer)
  15. (plug-in-gauss-rle 1 image cp-layer 4 1 1)
  16. (set! layer-mask (car (gimp-layer-create-mask cp-layer 0)))
  17. (gimp-layer-add-mask cp-layer layer-mask)
  18. (gimp-edit-copy cp-layer)
  19. (set! floating-selection (car (gimp-edit-paste layer-mask 0)))
  20. (gimp-floating-sel-anchor floating-selection)
  21. (gimp-invert layer-mask)
  22. (gimp-layer-set-mode cp-layer SCREEN-MODE)
  23. (gimp-layer-remove-mask cp-layer 0)
  24. (gimp-image-merge-visible-layers image 2)
  25. )
  26. (gimp-undo-push-group-end image)
  27. (gimp-displays-flush)
  28. )
  29. (script-fu-register "script-fu-after-expose"
  30. "this script after-expose your Photo"
  31. "Klaus Harrer"
  32. "copyright 2004, Klaus Harrer"
  33. "RGB"
  34. SF-IMAGE "IMAGE" 0
  35. SF-DRAWABLE "LAYER0" 0
  36. )
  37. (script-fu-menu-register "script-fu-after-expose"
  38. "<Image>/Script-Fu/Photo/after-expose...")

Die ersten drei Zeilen sind Kommentare und werden mit einen Semikolon eingeleitet. Kommentare sollten von Anfängern, sowie bei sehr komlexen Scripten genutzt werden, um die lesbarkeit des Scriptes zu gewährleisten.

Ab Gimp-2.4 müssen alle Variablen die per set! einen Wert zugewiesen bekommen, vorher bekannt gegeben werden(Vorwärtsdeklaration). Dies geschieht zwischen in der 10. und 11. Zeile. Die dort gesetzten Variablen bekommen ihren Wert in der 16. b.z.w 19. Zeile zugewiesen, und besitzen ihre Gültigkeit bis zur 25. Zeile.

Prozeduren

In der vierten Zeile wurde die Prozedur definiert die später im DB-Browser(Xtns->DB-Browser) registriert wird. Die Syntax(Schreibweise) für diese Prozedur wird mit einen define eingeleitet (nicht zu verwechseln mit den deklarieren globaler Variablen).

(define (Prozedurname Argument Argument ...)
...
)

Der Rückgabewert einer Prozedur ist immer die letzte Anweisung.

(define (hal-world input)
(let*((append-str " Welt"))
(string-append input append-str) ;; letzte Anweisung
)
)
(hal-world "Hallo") ;; Rückgabewert "Hallo Welt"

Am Beispiel der 8. Zeile erkläre ich genauer wie man mit den Prozeduren die im DB-Browser (Xtns->DB-Browser) definiert und registriert sind, umgeht.

Variablenname erstes Element(Liste) Prozedur Argument Argument
(cp-layer (car (gimp-layer-copy layer0 TRUE)))

Hier ein Auszug zu "gimp-layer-copy" aus den DB-Browser

Parameter
layer LAYER The layer to copy = layer0
add-alpha INT32 Add an alpha channel to the copied layer(TRUE or FALSE) = TRUE
Rückgabewerte
layer-copy LAYER The newly copied layer = cp-layer

Nun muss noch wie in der Beschreibung von "gimp-layer-copy" steht der kopierte Layer(cp-layer) noch dem aktuellen Bild(image) hinzugefügt werden. Die geschieht in der 8. Zeile mit der Prozedur

(gimp-image-add-layer image cp-layer -1)

Wichtig ist das alle geforderten Parameter (wie in Beschreibung), belegt sind.

In der 27. Zeile wird mittels (gimp-displays-flush) angewiesen das bearbeitete Bild auf den Bildschirm anzuzeigen. Diese Prozedur gilt nur für Scripte die auf bereits geöffnenten Bildern angwandt werden. Für Scripte die ein neues Bild erzeugen, sollte die Prozedur (gimp-display-new) angewandt werden.

Es gibt die Möglichkeit Gimp Funktionen zu gruppieren, das heisst, die Prozeduren die zwischen (gimp-undo-push-group-start image) die in der 5. Zeile und (gimp-undo-push-group-end image) in der 26. Zeile stehen, mit der Tastenkombination(Strg+z) rückgänig gemacht werden. Das ist in sofern sinnvoll, wenn sich der User des Skriptes nicht gefällt, wie das Bild beabeitet wurde b.z.w das Skript mit anderen Parameter gestartet werden soll. Ohne diese Gruppierung müsste der User jede einzelne Procedur rückänig machen.

Registrierbereich

Ab der 29. bis zur 38. Zeile liegt der Registrierungsbereich. Folgende Argumente müssen angegeben werden. Wichtig ist das die Reihenfolge, die in der folgenden Tabelle angegeben ist, eingehalten wird.

Argument Beschreibung
(script-fu-register "script-fu-after-expose" Name der Prozedur die im DB-Browser registriert wird
"this script after-expose your Photo" In dieser Zeile gibt es die Möglichkeit zu beschreiben, was genau dieses Script bewirkt
"Klaus Harrer" Autor des Skriptes
"copyright 2004, Klaus Harrer" das Copyright des Skriptes
"RGB*" Hier kann man den Image Typ(RGB oder GRAY) explizit festlegen, der bearbeitet b.z.w erstellt werden soll. Mittels " * " werden alle Typen eingeschlossen.

In der 34. und 35. Zeile werden Parameter übergeben die wichig sind um ein geöffnetes Bild zu bearbeiten(siehe anschliessende Tabelle). Diese Parameter werden über den Prozedurenkopf (define(script-fu-after-expose-scheme image layer0)) übergeben. Das heisst das der erste Parameter der in der Registrierprozedur erzeugt wird (SF-IMAGE "IMAGE" 0) auch an den ersten Parameter der Prozedur (define(script-fu-after-expose-schemeimage layer0) übergeben wird. Dies gilt analog für den zweiten, drttten ...u.s.w. Parameter. Es können noch weitere Parameter übergeben werden(siehe anschliessende Tabelle) die vom User über vorgefertigte Eingabemasken eingeben werden können.

Param-Typ Kurzbeschreibung Beispiele
SF-VALUE Beschreibt eine numerische Eingabe SF-VALUE "Blur Radius:" 5
SF-STRING Beschreibt eine Text-Eingabe SF-STRING "Text:" "The GIMP"
SF-FONT Beschreibt eine Font-Auswahl. Es erscheint ein Dialog, die das Schrift-Auswahl-Fenster von GIMP aktiviert. SF-FONT "Font:" "Arial"
SF-ADJUSTMENT Folgende Werte müssen in der folgnden Reihenfolgen in der Liste eingegeben werden
startwert,minialer Wert, maximaler Wert,minimaler Schritt, maximaler Schritt,[0] angegebene Werte als Ganzahl oder [1] angegebene Werte als Fließkommazahl,[0] wird ein Schieberegler angezeigt oder [1] wird eine Zählbox angezeigt
SF-ADJUSTMENT "Font Size (pixels):" ''(22 2 100 1 1 0 1)
SF-COLOR Zeigt an, daß eine Farbeingabe an dieser Stelle notwendig ist. Es erscheint ein Dialog zur Farbwahl. SF-COLOR "Color:" ''(0 0 0)
SF-TOGGLE Beschreibt einen logischen Parameter(TRUE FALSE), der durch eine Toggle-Box angezeigt wird. SF-TOGGLE "Resize?" TRUE
SF-IMAGE Falls das Script ein bereits geöffnetes Bild benötigt, ist dieser Parameter zu vereinbaren. GIMP trägt automatisch alle aktiven Bilder(ID) ein. SF-IMAGE "The image" 0
SF-DRAWABLE Wird der Bereich angegeben, der bearbeitet werden soll z.B Ebenen(Layer) SF-DRAWABLE "The layer" 0
SF-FILENAME Eingabe eines Dateinamens. Zeigt einen Dateidialog an. SF-FILENAME "Filename:" "file"
SF-PATTERN Eingabe eines Musters (Pattern). Zeigt einen Dialog zur Auswahl von Mustern an. SF-PATTERN "Pattern:" "Wood"
SF-GRADIENT Eingabe eines Farbverlaufes (Gradient). Zeigt einen Dialog zur Auswahl eines Farbverlaufes an. SF-GRADIENT "Blend:" "German_flag_smooth"

Mit diesen Grundlagen sollte man in der Lage sein Skripte in Script-Fu für Gimp zu erstellen.

Viel Spass!!!