Blog Entry
Python Plug-ins für Gimp Posted on May 21, 2007
Gimp, die kostenlose Grafik Software lässt sich sehr einfach mit eigenen Skripten erweitern. Ich bevorzuge Python, allerdings ist dasselbe mit Lisp, Perl, Ruby machbar.
Als Beispiel möchte ich hier mein Yin-Yang Plug-in zeigen. Zunächst muss das Plug-in für Gimp bekannt gemacht werden, dazu dient der folgende Code.
# Register with The Gimp register( "python_fu_yinyang", "Render a stand-alone Yin/Yang image", "Renders a black-and-white Yin/Yang symbol optionally with \"eyes\" that may optionally be images.", "Werner Hartnagel", "(c) 2005, Werner Hartnagel", "2005", "<Toolbox>/Xtns/Python-Fu/Misc/Yin-Yang...", "", [ [PF_INT32, "width", "Width", 256], [PF_INT32, "height", "Height", 256], [PF_TOGGLE, "insert_eyes", "Insert Eyes", 1], [PF_TOGGLE, "eyes_are_images", "Eyes are Images", 0], [PF_STRING, "top_eye_filename", "Top Eye Filename", ""], [PF_STRING, "bottom_eye_filename", "Bottom Eye Filename", ""], [PF_TOGGLE, "anti_aliasing", "Anti Aliasing", 1] ], [], py_yinyang) main()
Die ersten Zeilen der register Funktion sind nahezu selbsterklärend, es werden Parameter erwartet die Details über das Plug-in enthalten.
- Der interne Name unter welcher das Plug-in registriert wird, über diesen lässt sich das Plug-in innerhalb eines anderen Script genauso aufrufen wie jede andere Funktion in Gimp (...mehr dazu später).
- kurze Beschreibung
- detaillierte Beschreibung
- Autor
- Copyright
- Datum
- Menü-Pfad, in diesen Fall bedeutet <Toolbox> das Menü Eintrag im Hauptfenster (Toolbox) unter "Xtns->Python-Fu->Misc->Yin-Yang" zu finden ist. Eine weitere Möglichkeit wäre <Image>, das Menü welches mit einem rechten Mausklick auf ein geöffnetes Foto sichtbar ist.
- leerer String, wird nicht verwendet.
Nun kommt der eigentlich interessante Teil. Gimp macht es einfach GUI Elemente zu verwenden. Erwartet wird ein Tuple oder Array im folgenden Format:
Typ, Name, Beschreibung, Standard Wert [, Extra ].
Die hier verwendeten Typen sind:
- PF_INT32 - Ein Eingabefeld für eine Zahl
- PF_TOGGLE - Ein Button der On/Off sein kann
- PF_STRING - Text Eingabefeld
Es gibt noch viele weitere Typen die man in der PyGimp Dokumentation findet.
Der nächste Parameter wäre nun das Image Format auf das das Plug-in angewendet werden kann. Ein Beispiel wäre RGBA, damit würde sich das Plug-in nur auf ein Foto im 24-Bit Format mit Alpha Channel (Transparenz) anwenden lassen. Da unser Plug-in ein neues Bild erstellt macht dies kein Sinn und wir lassen diesen Punkt aus.
Der letzte Parameter ist die Funktion welche aufgerufen wird um das Bild zu generieren.
Hier die komplette Funktion um das Yin-Yang Symbol zu generieren.
def py_yinyang(width, height, do_eyes, eye_images, white_eye_image, black_eye_image, aa): # Create new image img = gimp.Image(width, height, RGB) # Disable Undo img.undo_group_start() oldcolor = gimp.get_foreground() layer = gimp.Layer(img, "Yin/Yang", width, height, RGBA_IMAGE, 100, NORMAL_MODE) img.add_layer(layer, 0) img.active_layer = layer draw = pdb.gimp_image_get_active_drawable(img) gimp.set_foreground([0,0,0]) pdb.gimp_selection_all(img) draw.fill(FOREGROUND_FILL) # Create the yin-yang shape pdb.gimp_selection_none(img) pdb.gimp_rect_select(img, 0, 0, width/2, height, CHANNEL_OP_ADD, False, 0) pdb.gimp_ellipse_select(img, width/2-width/4, 0, width/2, int(height/2), CHANNEL_OP_ADD, aa, False, 0) pdb.gimp_ellipse_select(img, width/2-width/4, height/2, width/2, height/2, CHANNEL_OP_SUBTRACT, aa, False, 0) gimp.set_foreground([255,255,255]) pdb.gimp_edit_bucket_fill(draw,0,0,100,0,0,0,0) # Cut away all but the central circle pdb.gimp_ellipse_select(img, 0, 0, width, height, CHANNEL_OP_REPLACE, aa, False, 0) pdb.gimp_selection_invert(img) pdb.gimp_edit_clear(draw) # Create the "eyes" if (do_eyes): x1 = width/2-width/16 y1 = height/2-height/4-height/16 x2 = x1 y2 = height/2+height/4-height/16 eyewidth = width/8 eyeheight = height/8 insert_eye(img, eye_images, white_eye_image, [0,0,0], x1, y1, eyewidth, eyeheight, draw, aa) insert_eye(img, eye_images, black_eye_image, [255,255,255], x2, y2, eyewidth, eyeheight, draw, aa) # Finish up gimp.set_foreground(oldcolor) pdb.gimp_selection_none(img) # Enable Undo img.undo_group_end() disp1 = gimp.Display(img)
Das ganze ist denkbar einfach, ein neues Foto wird erzeugt mit:
img = gimp.Image(width, height, RGB)
Dann wird die Undo Funktion abgeschaltet um Speicher zu sparen und den Vorgang zu beschleunigen. Unser Script ändert später mehrmals die Vordergrund Farbe, deshalb speichern wir die aktuelle Farbe und setzen diese wieder am Ende.
# Disable Undo img.undo_group_start() oldcolor = gimp.get_foreground()
Das weitere sind nun größtenteils Funktionen aus der sogenannten "Procedural Database", geniale ist die Funktionen lassen sich direkt in Gimp nachschlagen. Einfach den Browser unter: "Xtns->Procedure Browser" aufrufen und nach der gewünschten Funktion suchen.
Wir wollen nun alles auswählen, also geben wir bei der Suche ein "selection" ...schon werden alle Funktionen angezeigt mit der sich eine Auswahl erstellen lässt, "gimp-selection-all" dürfe genau gewünschte Resultat bringen. Jetzt gibt es noch folgendes zu beachten, der Bindestrich muss durch einen Unterstrich ersetzt werden. Der PD Browser ist eigentlich für für Script-Fu (Lisp) gedacht, in Python würde der Bindestrich jedoch ein subtrahieren bedeuten. Weiterhin müssen wir der Funktion ein pdb. voranstellen, falls wir nicht das pdb Modul global importiert haben (...ist auch nicht zu empfehlen).
to be continued...