3.5. Aanvullende functionaliteit toevoegen

Laten we doorgaan met onze training en nog wat functionaliteit aan ons script toevoegen.

3.5.1. Een nieuwe afbeelding maken

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 Paragraaf 12.9, “De procedureverkenner”.

Laten we beginnen met het maken van een nieuwe afbeelding. We zullen een nieuwe variabele maken, theImage, ingesteld op het resultaat voor het aanroepen van de ingebouwde functie voor GIMP gimp-image-new.

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*
              (
                 ; onze lokale variabelen definiëren
                 ; een nieuwe afbeelding maken:
                 (theImageWidth  10)
                 (theImageHeight 10)
                 (theImage (car
                                (gimp-image-new
                                 theImageWidth
                                 theImageHeight
                                 RGB
                                )
                           )
                 )
                 (theText)     ;een declaratie voor de tekst
                               ;die we later zullen maken
      

Opmerking: We gebruikten de waarde RGB om te specificeren dat de afbeelding een RGB-afbeelding is. We zouden ook 0 hebben kunnen gebruiken, maar RGB is meer beschrijvend als we in een oogopslag naar de code kijken.

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. Een nieuwe laag toevoegen aan de afbeelding

Nu we een afbeelding hebben, moeten we daar een laag aan toevoegen. We zullen de functie gimp-layer-new aanroepen om de laag te maken, waarbij we de ID doorgeven van de afbeelding die we zojuist hebben gemaakt. (Vanaf nu, in plaats van de volledige functie te vermelden, zullen we alleen de regels vermelden die we er aan toevoegen. U kunt het volledige script hier bekijken.) Omdat we alle lokale variabelen hebben gedeclareerd die we gebruiken, zullen we ook de markering met haakjes aan het einde van de declaraties voor onze variabelen sluiten:

        ;maak een nieuwe laag voor de afbeelding:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           "laag 1"
                           100
                           LAYER-MODE-NORMAL
                          )
                      )
            )
         ) ;einde van onze lokale variabelen
      

Als we eenmaal de nieuwe laag hebben, moeten we die toevoegen aan de afbeelding:

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

Nu, gewoon voor de lol, laten we eens kijken naar de vruchten van ons werk tot dit punt en deze regel toevoegen aan de nieuwe lege afbeelding:

(gimp-display-new theImage)

Sla uw werk op, herstart GIMP, voer het script uit en een nieuwe afbeelding zou naar voren moeten komen. Het zal waarschijnlijk bagger bevatten (willekeurige kleuren), omdat we het niet hebben verwijderd. We zullen dat zo doen.

3.5.3. De tekst toevoegen

Ga door en verwijder de regel om de afbeelding weer te geven (of maak er een opmerking van met een (;) als het eerste teken op de regel).

Voordat we tekst aan de afbeelding toevoegen, moeten we de kleuren voor de voor- en achtergrond instellen, zodat de tekst verschijnt in de kleur die de gebruiker heeft gespecificeerd. We zullen de functies gimp-context-set-back/foreground gebruiken:

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

Met de juiste kleuren ingesteld, laten we nu de bagger, die momenteel in de afbeelding staat, opruimen door de tekenbare te vullen met de achtergrondkleur:

        (gimp-drawable-fill theLayer FILL-BACKGROUND)
      

Met de schoongemaakte afbeelding, zijn we gereed om enige tekst toe te voegen:

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

Hoewel het een lange functie-aanroep is, is het behoorlijk rechtdoorzee als u door de parameters loopt terwijl u kijkt naar het item van de functie in de Procedureverkenner. In de basis maken we een nieuwe tekstlaag en wijzen die toe aan de variabele theText.

Nu we de tekst hebben, kunnen we de breedte en hoogte ervan grijpen en de afbeelding en de laag van de afbeelding op maat maken voor de grootte van de tekst:

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

Als u net zo bent als ik, vraagt u zich waarschijnlijk af wat een tekenbare is, vergeleken met een laag. Het verschil tussen die twee is dat een tekenbare alles is waarop kan worden getekend, inclusief lagen, maar ook kanalen, laagmaskers, de selectie, etc.; een laag is een meer specifieke versie van een tekenbare. In de meeste gevallen, is het onderscheid niet van belang.

Met de afbeelding klaar om te gaan, kunnen we nu onze regel voor het weergeven ervan opnieuw toevoegen:

        (gimp-display-new theImage)
      

Sla uw werk op, herstart GIMP en voer uw eerste script uit!

3.5.4. De vlag Vies opruimen

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.

We kunnen, om dat te doen, de vlag Vies opruimen na het weergeven van de afbeelding:

        (gimp-image-clean-all theImage)
      

Dat zal het tellen van Vies op 0 zetten, wat het er laat uitzien als een schone afbeelding.

Of deze regel moet worden toegevoegd of niet is een kwestie van persoonlijke smaak. Ik gebruik het in scripts die nieuwe afbeeldingen produceren, waar de resultaten triviaal zijn, zoals in dit geval. Als uw script heel gecompliceerd is, of als het werkt op een bestaande afbeelding, zou u deze functie waarschijnlijk niet willen gebruiken.