Grundlagen

Wer sich mit Perl schon beschäftigt hat wird bei diesen Tutorial keine Schwierigkeiten haben.
Hier erst mal einige Grundlagen.
Als erstes wird in Perl der Interpreter(Parser) eventuell mit einen Parameter angegeben.

#!usr/bin/perl -w(Warnungen werden ausgegeben)

Als nächstes werden die Perl Module für Gimp und Script-Fu eingebunden.

use Gimp;
use Gimp::Fu;

Es können natürlich auch noch andere Module wie zum Bsp. use strict; überprüft das die Syntax(Schreibweise) strickt eingehalten wird. Wer sich über weitere Module für Perl informieren möchte sollte im Link Bereich dieser Homepage schauen.

Jede Perl Anweisung wird mit einen Semikolon abgeschlossen.

In Perl werden Mathematische Operationen wie folgt definiert.

$ergebnis = 5 + 3; -> $ergebnis = 8
$ergebnis = 5 - 3; -> $ergebnis = 2
$ergebnis = 5 * 3 / (3 + 2);-> $ergebnis = 3

Zeichenketten(Strings) werden mit Anführungsstrichen eingeleitet b.z.w abgeschlossen.

$Zeichenk = "Hallo Welt";print(Ausgabe auf Bildschirm) "$Zeichenk"->Hallo Welt
$Zeichenk = "5 + 3"; print"$Zeichenk" -> 5 + 3

Die Variablen $ergebnis und $Zeichenk werden so genannte skalare Variablen gespeichert und werden mit"$" eingeleitet. Des weiteren gibt es in Perl Arrays(Datenfelder), die wie folgt definiert werden.

@farben = (''rot'',''gelb'',''blau'');print "$farben[0],$farben[1]";->rot,gelb

Und es gibt auch noch Hashes(Listen) die wie folgt definiert werden.

%farben = ("rot" => "#ff0000","gelb" => "#ffff00");print "$farben{''rot''},$farben{''gelb''}"->#ff0000,#ffff00

Es gibt noch andere Möglichkeiten Hashes zu definieren, gehe hier aber weiter nicht darauf ein.

Die einzelnen Perl-Fu Anweisungen werden in einen sub(Unterprogramm) zusammengefasst. Es gibt zwei Möglichkeiten sub(Unterprogramm) definieren. Die erste Möglichkeit ist, wir vergeben der sub keinen Namen.

sub {
Anweisung
Anweisung
...
}

Da bei dieser Variante(Inline-Kodierung) die sub sofort nach dem starten des Scriptes die ausgeführt wird, sollte der Registrierbereich oberhalb der sub liegen.

Die zweite Variante wir vergeben der sub einen Namen und führen sie an gewünschter Stelle aus.

sub Programm {
Anweisung
Anweisung
...
}
/&Programm;

Bei dieser Variante ist es völlig egal wo der Registrierbereich liegt,da wir die sub kontrolliert ausführen können.

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. #!/usr/bin/perl -w
  2. use Gimp;
  3. use Gimp::Fu;
  4. use strict;
  5. # *********************************************************
  6. # * Klaus Harrer 10/31/2005 mirror-object.pl *
  7. # *********************************************************
  8. sub mirr_obj {
  9. my ($img, $drw, $transparency, $spacing) = @_;
  10. Gimp->gimp_image_undo_group_start($img);
  11. Gimp->gimp_edit_copy($drw);
  12. my $mirror = Gimp->gimp_edit_paste($drw, 0);
  13. Gimp->gimp_floating_sel_to_layer($mirror);
  14. Gimp->gimp_flip($mirror, 1);
  15. my ($coordinate_x,$coordinate_y) =
    Gimp->gimp_drawable_offsets($mirror)
    ;
  16. my ($height, $width) = (Gimp->gimp_drawable_height($mirror),
    (Gimp->gimp_drawable_width($mirror));
  17. Gimp->gimp_layer_set_offsets($mirror,$coordinate_x, $height + $coordinate_y + $spacing);
  18. # und nun die objektorientierte Schreibweise
  19. my $mask = $mirror->create_mask(ADD_WHITE_MASK);
  20. $mirror->add_mask($mask);
  21. Gimp->gimp_palette_set_foreground([255, 255, 255]);
  22. Gimp->gimp_palette_set_background([0, 0, 0]);
  23. $mask->edit_blend(NORMAL_MODE,FG_BG_RGB_MODE,
    GRADIENT_LINEAR, $transparency, 0,REPEAT_NONE, 0, 0, 0, 0, 0, 0 ,0 , 0, $height);
  24. $mirror->set_opacity(60);
  25. $mirror->remove_mask(MASK_APPLY);
  26. $mirror->set_name("mirror layer");
  27. Gimp->gimp_image_undo_group_end($img);
  28. return ();
  29. }
  30. register
  31. mirrorobj",
  32. This Script mirror your selections",
  33. Help",
  34. Klaus Harrer",
  35. Klaus Harrer (c)",
  36. 10/30/04",
  37. <Image>/Filters/Map/mirror object",
  38. "*",
  39. [
  40. [PF_SLIDER, "transparency","transparency",80 ,[0, 100, 1]],
  41. [PF_INT, "spacing", "spacing to object", 1]
  42. ],
  43. \\&mirr_obj;
  44. exit main();

Die ersten drei Zeilen sind Kommentare und diese Kommentare werden mit einen "#" eingeleitet. Kommentare sollten von Anfängern oder bei sehr komplexen Scripten genutzt werden.

In der 8.Zeile wird die sub(Unterprogramm) eingeleitet. Die mit den Parametern $img, $drw, $transparency und $spacing übergeben wird ,die in der 9. Zeile des Beispielskriptes formuliert werden. Die Parameter $img und $drw sind Parameter die von ein bereits geöffneten Bild übergeben werden. Dabei bedeutet die Variable $img das geöffnete Bild und die Variable $drw der Bereich der bearbeitet werden soll(Selektionen, Ebenen...). Die Reihenfolge der Variablen die auf ein bereits geöffneten Bild angewandt werden ist immer gleich.(Bild, Bildbereich).
Die Parameter $transparency und $spacing sind Parameter die im Registrierbereich definiert werden und an die sub übergeben werden.

Funktionen

 

Die Perl-Fu Funktion muss statt mit einen Bindestrich wie es bei Script-Fu(Scheme) Funktionen der Fall ist, mit Unterstrich geschrieben werden.

Perl-Fu Syntax:
my ($coordinate_x,$coordinate_y) = Gimp->gimp_drawable_offsets($mirror);

Script-Fu Syntax:
(set coordinate_x (car (gimp-drawable-offsets)))
(set coordinate_y (cdr (gimp-drawable-offsets)))

Die Funktionen die für die jeweilgen Scriptsprachen möglich sind, wurden in einer prozedurale Datenbank zusammengefasst. Dort werden auch die Scripte die von ihnen erstellt wurden registiert. In dieser prozedurale Datenbank von Gimp werden die einzelnen Funktionen beschrieben. Des weiteren wird angegeben welche Parameter eingeben werden müssen und was ausgegeben wird.

erste Variable zweite Variable Perl-Fu Funktion Parameter
my ($coordinate_x, $coordinate_y) Gimp->gimp_drawable_offsets ($mirror)

 

Parameter
drawable DRAWABLE The drawable = $mirror
Rückgabewerte
offset-x INT32 x offset of drawable = $coordinate_x
offset-y INT32 y offset of drawable = $coordinate_y

Alternativ zu den eben prozedurale Syntax, gibt es die Möglichkeit den objektorientierte Syntax zu verwenden. Diese Syntax wird wie folgt angewendet.

prozedurale Syntax:
my ($coordinate_x,$coordinate_y) = Gimp->gimp_drawable_offsets($mirror);

objektorientierte Syntax:
my ($coordinate_x,$coordinate_y) = $mirror->offsets();

Wie an den Beispielen zu ersehen werden die Objekte(image,layer,drawable...) die als Parameter bei der prozeduralen Syntax angeben werden müssen, nach vorn gesetzt und werden dann als Parameter weggelassen. Die objektorientierte Syntax(verkürzte Syntax) sollte bevorzugt werden, da sie wesentlich übersichtlicher als die prozedurale Syntax ist.

Da es noch keine Vorschau zu den Ergebnissen der Scripte gibt sollten die Funktionen:

Gimp->gimp_image_undo_group_start($img);
b.z.w
Gimp->gimp_image_undo_group_end($img);

genutzt werden. Damit hat der User die Möglichkeit mit einer einfachen Tastenkombination(voreingestellt Strg+z) die Funktionen die zwischen den oben genannten Funktionen liegen, rückgängig zu machen.

Am Ende des Unterprogramm sollte ein return stehen. Dabei kommt es darauf an ob ein Perl Script auf ein bereits geöffnetes Bild angewandt wird oder ob ein neues Bild erzeugt wird.

return $img; wenn ein neues Bild erzeugt wird

return(); auf ein bereits geöffnetes Bild

Registrierbereich

Ab der 30. Zeile des Beispielscriptes beginnt der Registrierbereich, der folgende acht Zeilen enthalten muss. Wichtig dabei ist das auch die Reihenfolge eingehalten werden muss.

Argument Beschreibung
"mirrorobj", Der Name der Funktion die in der PDB-Datenbank registriert wird
"This Script mirror your selections", eine kurze Beschreibung zum Script
"Help", ein kurzer Hilfetext zur Benutzung des Scriptes
"Klaus Harrer", Autor des Skriptes
"copyright 2004, Klaus Harrer", das Copyright des Skriptes
"10/30/04", das Erstellungsdatum des Scriptes
"<Image>/Filters/Map/mirror object", Pfad wo das Script innerhalb der Menustruktur von Gimp zu finden ist
"*", Hier kann man den Image Typ(RGB oder GRAY) explizit festlegen, der bearbeitet b.z.w erstellt werden soll. Mittels " * " werden alle Typen eingeschlossen.

Es gibt die Möglichkeit das der User über vorgefertigte Eingabemasken, einzelne Parameter des Scriptes zu verändern. In der folgenden Tabelle kann man ersehen welche Parameter möglich sind

Param-Typ Kurzbeschreibung Beispiele
PF_INT
PF_INT32
PF_INT16
PF_INT8
Beschreibt eine numerische Eingabe [PF_INT, "spacing", "spacing to object", 1]
PF_STRING Beschreibt eine Text-Eingabe [PF_STRING, "Text:", "Hallo Welt"]
PF_FONT Beschreibt eine Font-Auswahl. Es erscheint ein Dialog, die das Schrift-Auswahl-Fenster von GIMP aktiviert. [PF_FONT, "Font:", "Arial"]
PF_SLIDER
PF_SPINNER

Parameterfeld mit Minimum, Maximum und Schrittweite [PF_SLIDER, "Slider",[0,100,1]]
PF_COLOR
PF_COLOUR
Farbangabe als Dezimal-Tripel [255,127,0] oder Hexakette
#FF7F00

[PF_COLOR, "Farbe",[255,127,0]]

[PF_COLOUR, "Farbe","#FF7F00"]

PF_TOGGLE
PF_BOOLEAN
Beschreibt einen logischen Parameter(0,1) [PF_TOGGLE "Resize?" 1]
PF_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. [PF_IMAGE "The image" 0]
PF_DRAWABLE Wird der Bereich angegeben, der bearbeitet werden soll z.B Ebenen(Layer) [PF_DRAWABLE "The layer" 0]
PF_FILE Eingabe eines Dateinamens. Zeigt einen Dateidialog an. [PF_FILE "Filename:" "file"]
PF_PATTERN Eingabe eines Musters (Pattern). Zeigt einen Dialog zur Auswahl von Mustern an. [PF_PATTERN "Pattern:" "Wood"]
PF_GRADIENT Eingabe eines Farbverlaufes (Gradient). Zeigt einen Dialog zur Auswahl eines Farbverlaufes an. [PF_GRADIENT "Blend:" "German_flag_smooth"]

Die Parameter image b.z.w drawable müssen als Parameter der sub(Unterprogramm) eingetragen werden, wenn man auf das bereits geöffnete Bild b.z.w auf das drawable(Ebene, Selektion..)zugreifen möchte. Dabei ist auch die Reihenfolge(image,drawable) einzuhalten. Desweiteren muss auch die Reihenfolge der Parameter die unterhalb des Registrierbereich eingetragen worden sind als Parameter der sub(Unterprogramm) übernommen werden.

Dieser Parameterbereich muss mit eckigen Klammern eingeschlossen werden so auch jeder einzelne Parameter. Die genaue Syntax ist von der 39. bis zur 42. Zeile der Beispielscriptes zu ersehen.

Dieser Parameterbereich muss mit eckigen Klammern eingeschlossen werden so auch jeder einzelne Parameter. Die genaue Syntax ist von der 39. bis zur 42. Zeile der Beispielscriptes zu ersehen.

Am Ende eines Perl-Fu Scriptes muss die Hauptfunktion beendet werden. Dies geschieht mit der Anweisung "exit main();".

Mit den Grundlage das dieses Tutorial vermittelt sollten sie der Lage sein einfache Perl-Fu Scripte zu erstellen.