3.5. Unserem Skript Leben einhauchen

Lassen Sie uns mit unseren Übungen fortfahren und unserem Skript etwas Funktionalität hinzufügen.

3.5.1. Ein neues Bild erstellen

In der vorigen Lektion haben wir eine leere Funktion geschaffen und Sie bei GIMP registriert. Nun wollen wir unserem Skript Funktionalität verschaffen – wir wollen ein neues Bild erstellen, den Text des Benutzers hinzufügen und das Bild skalieren, so dass der Text genau hineinpasst.

Wenn Sie erst wissen, wie man Variablen benutzt, Funktionen definiert und auf Listenelemente zugreift, ist der Rest eigentlich einfach. Sie müssen sich nur mit den Funktionen, die in GIMPs Prozedurendatenbank zur Verfügung stehen, vertraut machen und sie anwenden. Also öffnen Sie den Prozeduren-Browser und lassen Sie uns loslegen!

Lassen Sie uns damit anfangen, ein neues Bild zu erstellen. Wir legen eine neue Variable an, theImage, und weisen ihr das Ergebnis der internen GIMP-Funktion gimp-image-new zu.

Wie Sie im Prozeduren-Browser sehen können, erwartet die Funktion gimp-image-new drei Parameter: Breite, Höhe und Typ des Bildes. Da wir die Bildgröße später an den Text anpassen, erstellen wir zunächst nur ein 10x10 Pixel großes RGB-Bild. Wir speichern außerdem die Bildbreite und -höhe in einigen Variablen, da wir später im Skript auf sie zurückgreifen und sie verändern werden.

        (define (script-fu-text-box inText inFont inFontSize inTextColor)
        (let*
              (
                 ; unsere Variablen definieren
                 ; ein neues Bild erzeugen:
                 (theImageWidth  10)
                 (theImageHeight 10)
                 (theImage (car
                                (gimp-image-new
                                 theImageWidth
                                 theImageHeight
                                 RGB
                                )
                           )
                 )
                 (theText)     ;eine Bezeichnung für den Text
                               ;erstellen wir später
      

Beachten Sie, dass wir den Wert RGB verwendet haben, um das Bild als RGB-Bild zu spezifizieren. Wir hätten auch einfach »0« nehmen können, aber RGB ist viel aussagefähiger, wenn man sich den Code ansieht.

Sie sollten auch beachten, dass wir vom Ergebnis des Funktionsaufrufes den Kopf genommen haben. Das mag seltsam aussehen, da die Datenbank uns explizit sagt, dass die Funktion nur einen Wert zurückgibt – die ID (Kennung) des neu erstellten Bildes. Allerdings liefern alle GIMP-Funktionen eine Liste zurück, selbst wenn in dieser Liste nur ein Element ist, daher müssen wir auf den Kopf der Liste zugreifen.

3.5.2. Eine neue Ebene zum Bild hinzufügen

Jetzt, wo wir ein Bild haben, müssen wir eine Ebene hinzufügen. Wir rufen die Funktion gimp-layer-new auf, um die Ebene zu erstellen, wobei wir die ID des gerade erstellten Bildes übergeben. (Von nun an werden wir nur die Zeilen anführen, die wir hinzufügen, anstatt die vollständige Funktion anzugeben. Das vollständige Skript finden Sie hier.) Da wir alle lokalen Variablen, die wir verwenden, deklariert haben, werden wir auch das Klammernpaar schließen, welches das Ende unserer lokalen Variablen markiert:

        ;create a new layer for the image:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           "layer 1"
                           100
                           LAYER-MODE-NORMAL
                          )
                      )
            )
         ) ;end of our local variables
      

Wenn wir eine neue Ebene haben, müssen wir sie dem Bild hinzufügen:

        (gimp-image-insert-layer theImage theLayer 0 0)
      

Und jetzt, nur so zum Spaß, wollen wir uns die Früchte unserer Arbeit bis zu diesem Punkt anschauen. Wir fügen diese Zeile hinzu, um das neue, leere Bild darzustellen:

(gimp-display-new theImage)

Speichern Sie Ihr Skript, wählen Sie FilterSkript-FuSkripte auffrischen und rufen Sie das Skript auf: ein neues Bild sollte erscheinen. Es wird vermutlich irgendwelchen Datenmüll enthalten (zufällige Farben), da wir es bis jetzt noch nicht geleert haben. Dazu werden wir gleich kommen.

3.5.3. Den Text hinzufügen

Weiter geht's, löschen Sie zuerst die Zeile, um das Bild darzustellen (oder kommentieren Sie sie mit einem ; als erstem Zeichen der Zeile aus).

Bevor wir Text zum Bild hinzufügen, müssen wir die Vorder- und Hintergrundfarbe festlegen, so dass der Text in der vom Benutzer angegebenen Farbe erscheint. Wir verwenden dafür die Funktionen gimp-context-set-background und gimp-context-set-foreground:

        (gimp-context-set-background '(255 255 255) )
        (gimp-context-set-foreground inTextColor)
      

Mit den korrekt gesetzten Farben können wir nun den Datenmüll im Bild entfernen, indem wir die Zeichenfläche mit der Hintergrundfarbe füllen:

        (gimp-drawable-fill theLayer BACKGROUND-FILL)
      

Nach den Löschen des Bildes sind wir bereit, einen Text hinzuzufügen:

        (set! theText
                      (car
                           (gimp-text-fontname
                            theImage theLayer
                            0 0
                            inText
                            0
                            TRUE
                            inFontSize PIXELS
                            inFont)
                       )
        )
      

Obgleich lang ist der Funktionsaufruf doch ziemlich klar, wenn Sie die Parameter durchgehen und dabei gleichzeitig einen Blick auf den entsprechenden Eintrag im Prozeduren-Browser werfen. Im Grunde erstellen wir nur eine neue Textebene und weisen sie der Variablen theText zu.

Nachdem wir nun den Text haben, können wir seine Breite und Höhe bestimmen und das Bild sowie die Bildebene entsprechend skalieren.

        (set! theImageWidth   (car (gimp-drawable-width  theText) ) )
        (set! theImageHeight  (car (gimp-drawable-height theText) ) )

        (gimp-image-resize theImage theImageWidth theImageHeight 0 0)

        (gimp-layer-resize theLayer theImageWidth theImageHeight 0 0)
      

Wenn es Ihnen wir mir geht, fragen Sie sich vermutlich, was eine Zeichenfläche im Vergleich zu einer Ebene ist. Der Unterschied zwischen diesen beiden ist, dass die Zeichenfläche irgendetwas ist, in das man zeichnen kann, einschließlich Ebenen, aber auch Kanäle, Ebenenmasken, die Auswahl etc. Eine Ebene ist eine spezielle Version einer Zeichenfläche. In den meisten Fällen ist der Unterschied allerdings völlig unwichtig.

Mit dem fertigen Bild können wir nun unsere Ausgabezeile wieder hinzufügen:

        (gimp-display-new theImage)
      

Sichern Sie Ihre Arbeit, frischen Sie die Datenbank wieder auf und probieren Sie Ihr erstes Skript aus!

3.5.4. Das Geändert-Kennzeichen löschen

Wenn Sie versuchen, das erstellte Bild zu schließen ohne es vorher zu speichern, wird GIMP Sie fragen, ob Sie Ihre Arbeit sichern wollen, bevor Sie das Bild schließen. Das fragt es deshalb, weil das Bild als »geändert« beziehungsweise »ungesichert« markiert ist. Bei unserem Skript ist das für die Fälle störend, wo wir nur einen Test machen und im erstellten Bild nichts hinzufügen oder verändern. Bei so einem einfachen Skript ist die Ausgabe leicht reproduzierbar, es ist also sinnvoll, dieses Geändert-Kennzeichen zu entfernen.

Um das zu tun, können wir das Geändert-Kennzeichen löschen, nachdem wir das Bild dargestellt haben:

        (gimp-image-clean-all theImage)
      

Dies setzt den Änderungenzähler auf 0 und lässt das Bild als unverändert erscheinen.

Ob Sie diese Zeile hinzufügen oder nicht ist eine Frage des persönlichen Geschmacks. Ich verwende sie in Skripten, die neue Bilder produzieren und wo die Ergebnisse trivial ist, so wie in diesem Fall. Wenn Ihr Skript sehr kompliziert ist oder wenn es auf einem existierenden Bild arbeitet, werden Sie diese Funktion vermutlich nicht verwenden wollen.