3.5. Adding Additional Functionality
| 3. Ein Skript-Fu-Tutorial |

### 3.5. Adding Additional Functionality

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

#### 3.5.1. Ein neues Bild erstellen

In the previous lesson, we created an empty function and registered it with GIMP. In this lesson, we want to provide functionality to our script — we want to create a new image, add the user's text to it and resize the image to fit the text exactly.

Once you know how to set variables, define functions and access list members, the rest is all downhill — all you need to do is familiarize yourself with the functions available in GIMP's procedural database and call those functions directly. Open the Abschnitt 12.9, „Prozeduren-Browser“.

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.

As you can see from the DB Browser, the function `gimp-image-new` takes three parameters — the image's width, height and the type of image. Because we'll later resize the image to fit the text, we'll make a 10×10 pixels RGB image. We'll store the image's width and sizes in some variables, too, as we'll refer to and manipulate them later in the script.

            (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.

You should also notice that we took the head of the result of the function call. This may seem strange, because the database explicitly tells us that it returns only one value — the ID of the newly created image. However, all GIMP functions return a list, even if there is only one element in the list, so we need to get the head of the list.

#### 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
                               "layer 1"
                               theImageWidth
                               theImageHeight
                               RGB-IMAGE
                               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)

Save your work, restart GIMP, run the script and a new image should pop up. It will probably contain garbage (random colors), because we haven't erased it. We'll get to that in a second.

#### 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 FILL-BACKGROUND)

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

            (set! theText
                          (car
                               (gimp-text-font
                                theImage theLayer
                                0 0
                                inText
                                0
                                TRUE
                                inFontSize
                                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-get-width  theText) ) )
            (set! theImageHeight  (car (gimp-drawable-get-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)

Save your work, restart GIMP and give your first script a run!

#### 3.5.4. Das Geändert-Kennzeichen löschen

If you try to close the image created without first saving the file, GIMP will ask you if you want to save your work before you close the image. It asks this because the image is marked as dirty, or unsaved. In the case of our script, this is a nuisance for the times when we simply give it a test run and don't add or change anything in the resulting image — that is, our work is easily reproducible in such a simple script, so it makes sense to get rid of this dirty flag.

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.

3.4. Ihr erstes Fu-Skript |  | 3.6. Das Textbox-Skript erweitern

Report a bug in GIMP Report a documentation error