Programmiertes Malen
Gimp-Scripts schreiben
PDB-Funktionen an die Arbeit
Die Arbeitsfunktion muss sich nun erst einmal ihren Namen verdienen, denn bisher tut sie nichts. Eine PDB-Suche nach select findet einige Funktionen. Die richtige heißt gimp_ellipse_select. Der erste Parameter ist das Bild selbst, das dem ersten Parameter der Arbeitsfunktion entspricht. Die folgenden vier geben die Größe der Auswahl an, als X-Wert, Y-Wert, Breite (width) und Höhe (height). Der Parameter option legt fest, ob die Auswahl hinzugefügt wird (CHANNEL_ADD_OP), ob sie eine bestehende ersetzt (CHANNEL_REPLACE_OP) und so fort. Der PDB-Browser zeigt übrigens, wie auch für weitere Parametertypen, geringfügig andere Namen an: zum Beispiel GIMP_CHANNEL_ADD_OP. In Python-Skripts lassen Sie das GIMP_ einfach weg.
Weist man antialias den Wert TRUE zu, glättet Gimp die Auswahllinie. Genauso funktioniert feather, das für einen stufenweisen Übergang sorgt. Der letzte Parameter feather_radius legt die Breite dieses Übergangs fest. Im Skript steht an dieser Stelle kein fester Wert, sondern die Eingabevariable feather_in, die der Benutzer verändern kann (Zeile 5 in Listing 2).
Listing 2
Arbeitsfunktion
def python_vignette(img, drawable, feather_in, opacity_in): width = drawable.width height = drawable.height pdb.gimp_ellipse_select(img, 0, 0, width, height, CHANNEL_OP_REPLACE, TRUE, TRUE, feather_in) pdb.gimp_selection_invert(img) pdb.gimp_edit_bucket_fill(drawable, FG_BUCKET_FILL, MULTIPLY_MODE, opacity_in, 0, 0, 0, 0) pdb.gimp_selection_none(img)
Alle bisher verwendeten Methoden gehören zum Objekt pdb, werden also nach dem Schema pdb.methode() aufgerufen. Deshalb kann man kaum noch von Objektorientierung sprechen, denn die zeichnet sich ja gerade dadurch aus, dass Methoden und Objekte sachlich zusammengehören. Allerdings kennt Gimp-Python auch objektorientierte Formulierungsalternativen: zum Beispiel funktioniert statt pdb.gimp_add_layer(img, ...) auch img.add_layer(...). Das heißt, man ruft die Methode gimp_add_layer() des Objekts img auf, dafür fällt img als Parameter weg. In dieser Form sind die Funktionen im PDB-Browser nicht dokumentiert, sodass wieder Forschungsarbeit nötig wird.
Die Methode gimp_selection_invert kehrt einfach die aktuelle Auswahl um. Schließlich füllt gimp_edit_bucket_fill den ausgewählten Bereich mit der aktuellen Vordergrundfarbe. Dafür sorgt der zweite Parameterwert FG_BUCKET_FILL; stünde hier PATTERN_BUCKET_FILL, würde das Werkzeug das ausgewählten Füllmuster verwenden.
Der folgende Parameter legt fest, auf welche Art die neue Farbebene auf den Hintergrund aufgetragen wird. Der Wert NORMAL_MODE ersetzt die alte Farbschicht einfach. Der im Beispiel verwendete MULTIPLY_MODE sorgt dafür, dass Gimp den alten und den neuen Farbton mischt. Die zur Verfügung stehenden Modi listet unter anderem das Ebenen-Menü auf, die zugehörigen Schlüsselwörter der PDB-Browser (allerdings wieder mit einem überflüssigen GIMP_). Probieren Sie doch mal spaßeshalber DISSOLVE_MODE aus.
Undo abschalten
Beim nächsten Parameter legt der Eingabewert opacity_in die Deckkraft für das Füllen fest. Eine große Zahl sorgt für einen dunkleren, eine kleinere Zahl für einen helleren Rand. Der Vollständigkeit halber entfernt das Skript die Auswahl mit gimp_selection_none wieder. Alle Schritte lassen sich übrigens mit Undo rückgängig machen, denn Gimp führt bei Skripts genauso intern Buch, wie bei der interaktiven Arbeit. Die Funktion gimp_image_undo_disable schaltet diese Buchführung und damit auch Undo ab.
Startet man das Skript mit einem geöffneten Bild, sieht das Ergebnis ungefähr so aus, wie in Abbildung 2. Der Effekt wurde etwas übertrieben gewählt, damit er im Bild besser sichtbar ist. Etwas weniger Deckkraft wäre hier besser. Das komplette Skript finden Sie ebenfalls auf unserem FTP-Server.



