RSS-/Atom-Feed Twitter
Site is read-only, email is disabled

Tutorial: Skript-Fu-Einführung

Verfasst von · Erstellt am 09 Sep 2006, zuletzt bearbeitet vor mehr als 13 Jahren CC BY-NC-Lizenz

Motivation

Mit Skript-Fu gibt es eine mächtige Möglichkeit, Vorgänge in GIMP zu automatisieren und Skripts für alles Mögliche zu erstellen. Hier werden die Grundlagen erklärt, die man braucht, um eigene GIMP-Skripts zu schreiben bzw. andere zu verstehen.

Tutorial-Details

  1. 1

    Alle Funktionen, die GIMP über die GUI (grafische Benutzerschnittstelle) dem Benutzer anbietet, können auch von Skripten (Makros) genutzt werden. Mit solchen Skripten kann man Vorgänge, z.B. bestimmte Effekte oder Filter, automatisieren (Script-Fu bzw. Skript-Fu). GIMP unterstützt mehrere Programmiersprachen, mit denen die GIMP-Befehle verwendet und GIMP-Skripts geschrieben werden können (Bindings). Seit Anfang an ist Scheme dabei. In dieser Sprache wird das klassische Skript-Fu geschrieben; damit wollen wir uns in diesem Tutorial beschäftigen. Es gibt aber auch die Möglichkeit, Skripts mit gimp-perl bzw. Python (Python-Fu) zu schreiben.

  2. 2

    Scheme ist ein LISP-Dialekt. Scheme besitzt nicht viele von anderen Programmiersprachen gewohnte Features (z.B. keine Schleifen), dafür gibt es auch wenig Einschränkungen.

    Jemand, der andere Programmiersprachen beherrscht, wird sich relativ schnell mit Scheme zurechtfinden, auch wenn es ein paar Eigenheiten aufweist. Aber auch für Neulinge ist es nicht so schwer zu lernen, wenn man z.B. vorhandene Skripts kopiert und nur die relevanten Stelle ändert.

    GIMP besitzt auch eine Skript-Fu-Konsole (Xtns / Skript-Fu / Skript-Fu-Konsole). Diese kann dazu verwendet werden, um einzelne Befehle auszuführen, Skripts zu testen usw.

    Wir starten die Skript-Fu-Konsole.

  3. 3

    Folgenden Befehl geben wir in die Skript-Fu-Konsole ein:
    (gimp-message “Hier spricht GIMP!”)
    Eine Dialogbox sollte erscheinen.

    Erklärung:
    Jeder Befehl wird innerhalb von Klammern geschrieben. Der erste Ausdruck nach der öffnenden Klammer ist der Befehl, dann folgen die Parameter (hier nur 1 Parameter, und zwar der auszugebende Text) und dann die schließende Klammer.

  4. 4

    Alle Befehle, die von GIMP zur Verfügung gestellt werden, können im Prozedurbrowser PDB angeschaut werden.

    Wir starten mit Xtns / Prozedurbrowser den PDB. Bei “Suche:” geben wir “gimp-message” ein und erhalten rechts Informationen über diese Funktion. Es wird auch mitgeteilt, dass diese Funktion nur 1 Parameter vom Typ STRING (Zeichenfolge) hat, der in UTF-8-Kodierung angebeben werden muss.

    Der Prozedurbrowser ist beim Programmieren von Skript-Fu von großer Bedeutung, da er eine vollständige Referenz von GIMP-Befehlen ist. Wenn man einen Vorgang aus einem Skript heraus ausführen will (z.B. eine Bild duplizieren), muss man im Skript-Fu danach suchen (“duplicate”), die Ergebnisse durchschauen und die passende Funktion, so man sie gefunden hat, verwenden.

  5. 5

    Zur Syntax: Wie oben bereits erwähnt, werden Befehle von runden Klammern umgeben:
    [code](Befehl Parameter1 Parameter2 …)[/code]

    Das erste Wort muss nicht unbedingt ein Befehl, sondern kann auch ein Operator sein:
    (+ 6 2) hat den Wert 8 (Operator +, die zwei Parameter sind 6 und 2)
    (if (= var 0) (befehl1) (befehl2)) Wenn var=0, führe befehl1 aus, sonst befehl2 (Näheres zu if unten)

    Alles, was in einer Zeile ab einem Strichpunkt steht, wird als Kommentar angesehen und nicht ausgeführt:
    ; Dies ist ein Kommentar

    Man beachte den Befehl print (im Screenshot), der nicht im PDB angezeigt wird, weil er vom Scheme-Interpreter und nicht von GIMP zur Verfügung gestellt wird. Mit print kann der Inhalt von Ausdrücken in der Skript-Fu-Konsole angezeigt werden. Das ist zum Debuggen sehr nützlich.

  6. 6

    Scheme kennt natürlich auch Variablen und Konstanten. Diese werden ohne Präfix (kein $, % usw) mit normalen Wörter bezeichnet. Die Zuweisung erfolgt mit define (Konstanten) bzw. let und set (Variablen).

    Folgende Datentypen existieren:

    • Prozeduren: Für die Definition von Unterprogrammen (Prozeduren) gibt es keinen eigenen Befehl, sondern sie werden wie jeder andere Datentyp behandelt. So wie einer Variable ein Wert zugewiesen wird, wird einer Prozedur der Codeblock zugewiesen, den sie beinhalten soll.
    • Listen
    • Ganze Zahlen (beliebig groß)
    • Dezimalzahlen
    • Zeichenketten (Strings)
    • Boolean (wahr: #t bzw. falsch: #f)
  7. 7

    Variablen können global mit set! gesetzt werden.
    Beispiel auf der Skript-Fu-Konsole:
    (set! s “GIMP! GIMP! GIMP!”)
    (gimp-message s)

    Für lokale Variablen, d.h. solche, die nur innerhalb eines bestimmten Codebereiches gültig sind, ist es etwas komplizierter:
    [b](let [color=red]((name1 wert1) (name2 wert2))[/color] [color=blue](befehl1) (befehl2)[/color])[/b]

    Der erste Parameter (rot) besteht aus beliebig vielen Zuweisungen der Form (Var.name Wert), der Codeblock (blau) besteht aus beliebig vielen Anweisungen, in denen die Variablen gültig sind. Beispiel aus der Praxis:

    • [color=red](
      (fname (car f))
      (img (car (gimp-file-load 1 fname fname)))
      )[/color][color=blue]
      (gimp-image-undo-disable img)
      (gimp-image-scale img newx newy 0 0)
      (gimp-file-save 1 img (car (gimp-image-get-active-drawable img)) fname fname)
      (gimp-image-delete img)[/color]
      )[/code]

    Hier wurde *let** statt let verwendet. Der Unterschied ist, dass bei *let** die Variablen in der angegebenen Reihenfolge definiert werden. Bei let könnte GIMP zuerst “img” und dann “fname” setzen, was nicht funktionieren würde.

    Hier sehen wir auch, dass jeder “Wert” auch durch einen geklammerten Ausdruck ersetzt werden kann: fname wird der Wert von “(car f)” zugewiesen usw.

    Konstanten und Funktionen werden mit define gesetzt:
    [code](define c 300000000) ; Lichtgeschwindigkeit
    (define (func)
    (gimp-message “func wurde aufgerufen”)
    )
    (func) ; Funktion aufrufen[/code]

  8. 8

    Listen bestehen in Scheme immer aus einem Kopf und einem Rest (nichts dazwischen). Auf den Kopf greift man mit car zu, auf den Rest mit cdr. Will man mehr als 2 Elemente auflisten, werden die Listen verschachtelt. Allerdings kann man der Einfachkeit halber mehr als 2 Listenelemente mit einem Befehl setzen:
    (set! l ’(1 2 3 4 5))
    Das einfache Anführungszeichen steht hier für “Liste”.

    Die Liste sieht jetzt im Speicher so aus:
    (1 (2 (3 (4 5))))

    Mit car können wir den Listenkopf anschauen, mit cdr den Rest:
    (car l) => 1
    (cdr l) => (2 3 4 5)

    GIMP-Funktionen liefern als Rückgabewert immer eine Liste. So können theoretisch mehrere Rückgabewerte auf einmal zurückgegeben werden; das wird aber (noch) von keiner GIMP-Funktion verwendet. Will man auf den eigentlich Rückgabewert zurückgreifen, muss man also car verwenden. Skript-Fu-Konsole
    (print (car (gimp-version))) => “2.3.11”

    Zum Iterieren von Listen verwendet man rekursive Funktionsaufrufe.

  9. 9

    Eine Fallunterscheidung / if-Anweisung hat folgende Syntax:
    [b](if [color=red]bedingung[/color] [color=blue]then-codeblock[/color] [color=brown]else-codeblock[/color])[/b]

    Beispiel:
    [b](if [color=red](> x 0)[/color]
    [color=blue](print “x ist positiv”)[/color]
    [color=brown](print “x ist nicht positiv”)[/color]
    )[/b]

  10. 10

    Nachdem wir jetzt die Grundlagen der Syntax beherrschen, können wir beginnen, Skripts zu schreiben. Wenn wir aber nicht immer die Skript-Fu-Konsole verwenden wollen und das Skript auch in GIMP-Menü erscheinen soll, muss eine bestimmte Vorgangsweise eingehalten werden.

    Das Skript selbst wird als .scm-Datei in ~/.gimp-2.3 (bzw. -2.4) abgelegt. Hier laden wir die Datei “beispiel.scm” (rechts unter Downloads verfügbar) in das gimp-Skript-Verzeichnis.

  11. 11

    Wenn wir das Skript dort abgelegt haben und den GIMP 2.4 (2.3) starten (oder, falls der GIMP bereits gestartet ist: Xtns / Skript-Fu / Skripte auffrischen), findet sich unter Xtns / Verschiedenes jetzt das “Beispielskript”. Hier noch einmal der Inhalt (ohne Einrückungen):

    (script-fu-beispiel parameter) (gimp-message parameter)

    )[/color]

    ; Im GIMP und im Menü registrieren
    [color=red](script-fu-register “script-fu-beispiel”
    _"_Beispielskript"
    “Illustriert den Aufbau eines GIMP-Skripts”
    “Richard Hirner”
    “2006, Richard Hirner”
    “Sep 10, 2006”
    ""
    SF-STRING “Erster Parameter” “Hallo!”)[/color]
    [color=blue](script-fu-menu-register “script-fu-beispiel”
    /Xtns/Misc”)[/color]
    [/code]

  12. 12

    Ganz oben im Code wird die Funktion, die aufgerufen wird, wenn das Skript-Fu ausgeführt wird, definiert (braun).

    Die Funktion heißt “script-fu-beispiel” und hat einen Parameter namens “parameter”. Die Funktion ruft nur gimp-message auf und zeigt somit eine Dialogbox mit dem Inhalt von “parameter” an.

    In anderen Skripts gehört hier statt gimp-message der Code, der die Bildbearbeitung durchführt, eingesetzt.

  13. 13

    script-fu-register registriert die Funktion “script-fu-beispiel” im GIMP (rot). Sie ist dann auch im PDB einsehbar (siehe Screenshot). Die Parameter:
    1. Name der Funktion, die registriert wird
    2. Wo im Menü die Funktion registriert werden soll (der Unterstrich signalisiert, dass der Eintrag im Menü extra gemacht wird, siehe unten)
    3. Beschreibung
    4. Autor
    5. Copyright
    6. Datum
    7. Auf welche Bilder das Skript angewendet werden kann. Mögliche Werte: “*” für alle Bilder, “RGB” oder “GRAY” für RGB- bzw. Graustufenbilder (in allen 3 Fällen muss ein solches Bild offen sein, damit das Skript aufgerufen werden kann); ein leerer String "" bedeutet, dass das Skript ein neues Bild erzeugt bzw. ohne offenes Bild verwendet werden kann.
    8. Liste mit Parametern des Skripts, alle in der Form:
    SF-TYP “Beschreibung” “Standardwert”
    SF-TYP kann dabei verschiedene Werte annehmen, siehe unten.

    Im Menü wird das Skript mit der Funktion script-fu-menu-register registriert (blau).
    Parameter:
    1. Funktion, die registriert wird
    2. Ort im Menü (hier “ / Xtns / Misc”)

  14. 14

    Möglichkeiten für die Parameter (SF-TYP Beschreibung Standardwert):

    SF-VALUE “Zahlenwert eingeben:” 5
    SF-STRING “Zeichenkette eingeben:” “beliebiger Text”
    SF-FONT “Schrift auswählen:” “Times”
    SF-COLOR “Farbe:” ’(255 0 0)
    SF-TOGGLE “Kopie erstellen?” TRUE
    SF-FILENAME “Originaldatei:” “*.jpg”
    SF-PATTERN “Hintergrundmuster:” “Craters”
    SF-GRADIENT “Verlauf:” “CD”

    SF-IMAGE “Ausgangsbild” 0
    SF-DRAWABLE “Ausgangsebene”
    (Gehört zusammen)

    SF-ADJUSTMENT “Wert einstellen:” ’(22 2 100 1 1 0 1)
    Die Liste beinhaltet:
    Anfangswert, minimaler Wert, maximaler Wert, minimale Schrittweite, maximale Schrittweite, 0 Werte als Ganzahl oder 1 Werte als Kommazahl, 0 Schieberegler oder 1 Zählbox

    Die Parameter werden in der Reihenfolge, wie sie bei script-fu-register angegeben werden, an die registrierte Funktion übergeben.

    Führt man das Skript-Fu im GIMP aus, erscheint eine Dialogbox, in der man diese Parameter einstellen kann. Klickt man dann auf “OK”, wird die registrierte Funktion ausgeführt. Im Dialog erscheint dann, was das Skript gerade tut. Wenn die registrierte Funktion fertig ist, schließt sich der Dialog.

  15. 15

    Viel Spaß beim Herumexperimentieren! Es empfiehlt sich auch, die bereits mitgelieferten Skript-Fus (im script-Verzeichnis) eingehend zu studieren.

    Diese liegen unter Linux meist in [b]/usr/[color=gray]local/[/color]share/gimp/2.0/scripts/[/b], bei Windows einfach im scripts-Verzeichnis von GIMP.

Kommentare

Hier kannst du Kommentare, Fragen und Anregungen loswerden. Der Autor und die anderen Benutzer können deinen Beitrag sehen und darauf antworten.

Natürlich kannst du auch im Chat fragen.

Abo-Verwaltung

Diese Funktion steht nur angemeldeten Benutzern zur Verfügung.

New comments are disabled because of spam.

Ralf
vor mehr als 7 Jahren

Ich brauche schnellstens ein Skript Fu Bilder sollen in ein Verzeichnis gelegt werden, der Dekorationsfilter Fuzzy Border mit den Optionsmöglichkeiten des Originals soll auf alle angewendet werden und die Bilder sollen dann wieder in ein Verzeichnis. Wer hat Interesse da etwas dran zu machen? Ich zahle auch gerne etwas dafür!

gummibär
vor mehr als 8 Jahren

Tja. auch ich scheitere dran. Selbst mit dem Massage... , ähm... Message-Handler geht's nicht.
(#t)(#t)

Molitor
vor etwa 11 Jahren

Durch Probieren habe ich herausgefunden, was an dem Tutorial falsch ist: Man muss zuerst den Massage-Handler setzen!

Also ins's Eingabefeld (natürlich in einer Zeile):

(gimp-message-set-handler MESSAGE-BOX) (gimp-message "message")

Moltor
vor etwa 11 Jahren

Schon das erste Beispiel funktioniert nicht:
auf
(gimp-message "Hallo Gimp!")
erscheint
> (gimp-message "Hallo Gimp!")
(#t)

Was ist falsch?

abc
vor mehr als 12 Jahren

irgendwie geht das mit schritt 3 schon nicht (gimp message "...").
kann mal irgendjemand das tutorial aktualisieren oder gleich an ganz neues schreiben?

The_Scout
vor mehr als 13 Jahren

Danke! Fünfmal durchgelesen und jedes Mal übersehen -.-

devvv Mitglied seit mehr als 17 Jahren devvv 1475 Kommentare
vor mehr als 13 Jahren

Unter Filter / Script-Fu / Konsole ;)

The_Scout
vor mehr als 13 Jahren

Hi @ll,
ich hab gleich beim ersten Schritt ein Problem: Ich finde Xtns nicht. Ich habe GIMP 2.6, und alles Mögliche und Unmögliche versucht. Vergeblich. Also, ich fände es super, wenn du sagen könntest, wo man die Konsole bei GIMP 2.6 findet.
Danke schonmal, SCOUT

VincentX
vor mehr als 13 Jahren

Ich kann nichts in die Scrip-Fu Konsole eingeben. Egal was ich schreibe, es passiert gar nichts.

sivizius
vor mehr als 13 Jahren

ich krieg das einfach nicht hin.
ich hab gimp2.6 auf ubuntu 9.04 und keiner der bilder und pfade stimmen wirklich mit meinen gimpfenstern überein.
sind die versionen soviel anders?

chrispa Mitglied seit mehr als 14 Jahren chrispa 1 Kommentar
vor etwa 14 Jahren

Hallo,
habe die Gimp_Version 2.6. Bei allen Anwendungen mit einem Script-Fu (z.B. Glas-Script) kommen Fehlermeldungen. Kann das Glas-Script nicht anwenden!
Danke- chrispa

Naubaddi
vor mehr als 14 Jahren

Hi, nach der Eingabe von (gimp-message "Hier spricht GIMP!") erscheint (#t) im Konsole-Fenster, bei "durchsuchen" ist die Funktion vorhanden.

Benutze Gimp 2.6

Gruß, Hermann

mralmani
vor mehr als 14 Jahren

Bei mir kommt bei:
(gimp-message "Hier spricht GIMP!")
Keine Box sondern steht nur unten am Rand die Nachricht.

Anakain Mitglied seit etwa 16 Jahren Anakain 8 Kommentare
vor etwa 16 Jahren

Kann es sein das ich eine andere Gimp-Version brauch? Bei mir kommen bei fast allen Befehlen die ich eingebe irgendwelche Fehlermeldungen.
Ich hab 2.4

Peter
vor etwa 16 Jahren

tolles tutorial!
hat mir sehr geholfen!

Matze Mitglied seit fast 17 Jahren Matze 7 Kommentare
vor fast 17 Jahren

Nettes Tut!
Hat jemand ICQ an den ich mich wenden kann falls ich Fragen habe? Der Autor antwortet nicht ;-)
Ach ja, tut mir Leid hier einen (evtl.) unqualifizierten Post hinterlassen zu haben, ich bin noch neu hier =)
greetz