3.5. Lägga till ytterligare funktionalitet

Låt oss fortsätta vår träning och lägga till lite funktionalitet till vårt skript.

3.5.1. Skapa en ny bild

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 Avsnitt 12.9, ”Procedurbläddrare”.

Låt oss börja med att göra en ny bild. Vi kommer skapa en ny variabel, theImage, som ställs in till resultatet av att anropa GIMPs inbyggda funktion 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*
              (
                 ; definiera våra lokala variabler
                 ; skapa en ny bild:
                 (theImageWidth  10)
                 (theImageHeight 10)
                 (theImage (car
                                (gimp-image-new
                                 theImageWidth
                                 theImageHeight
                                 RGB
                                )
                           )
                 )
                 (theText)     ;en deklaration för texten
                               ;vi skapar senare
      

Observera: Vi använder värdet RGB för att ange att bilden är en RGB-bild. Vi kunde också ha använt 0, men RGB är mer beskrivande då vi tittar snabbt på koden.

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. Lägga till ett nytt lager till bilden

Nu då vi har en bild så behöver vi lägga till ett lager till den. Vi kommer anropa funktionen gimp-layer-new för att skapa ett nytt lager, och skicka med ID för bilden som vi just skapat. (Från och med nu kommer vi i stället för att lista hela funktionen endast lista raderna som vi lägger till i den. Du kan se det fullständiga skriptet här.) Eftersom vi deklarerat alla lokala variabler som vi kommer använda så kommer vi också stänga parenteserna som markerar slutet på våra variabeldeklarationer:

        ;skapa ett nytt lager för bilden:
           (theLayer
                     (car
                          (gimp-layer-new
                           theImage
                           "lager 1"
                           theImageWidth
                           theImageHeight
                           RGB-IMAGE
                           100
                           LAYER-MODE-NORMAL
                          )
                      )
            )
         ) ;slut på våra lokala variabler
      

När vi har det nya lagret behöver vi lägga till det till bilden:

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

Låt oss nu för skojs skull se frukterna av vårt arbete så här långt, och lägga till denna rad för att visa den nya, tomma bilden:

(gimp-display-new theImage)

Spara ditt arbete, starta om GIMP och kör skriptet så ska en ny bild poppa upp. Den kommer troligen innehålla skräp (slumpmässiga färger), för vi har inte raderat den. Vi kommer till det om ett ögonblick.

3.5.3. Lägga till texten

Ta nu bort raden för att visa bilden (eller kommentera ut den med ett (;) som första tecken på raden).

Innan vi lägger till text till bilden behöver vi ställa in bakgrunds- och förgrundsfärgerna så att texten visas i de färger användaren angav. Vi kommer använda funktionerna gimp-context-set-back/foreground:

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

Låt oss nu då färgerna ställts in ordentligt rensa bort skräpet som finns i bilden genom att fylla ritytan med bakgrundsfärgen:

        (gimp-drawable-fill theLayer FILL-BACKGROUND)
      

Med bilden rensad så är vi redo att lägga till lite text:

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

Även om det är ett långt funktionsanrop så är det ganska okomplicerat om du går igenom parametrarna medan du tittar på funktionens post i databasbläddraren. Vi skapar helt enkelt ett nytt textlager och tilldelar det till variabeln theText.

Nu när vi har texten kan vi ta dess bredd och höjd, och ändra storlek på bilden och bildens lager till storleken på texten:

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

Om du är som jag undrar du förmodligen vad en rityta är jämfört med ett lager. Skillnaden mellan de två är att en rityta är vad som helst som kan målas på, inkluderande lager, men även kanaler, lagermasker, markeringen och så vidare. Ett lager är en mer specifik version av en rityta. I de flesta fall är skillnaden oviktig.

Med bilden färdig så kan vi nu åter lägga till vår visningsrad:

        (gimp-display-new theImage)
      

Spara ditt arbete, starta om GIMP och kör ditt första skript!

3.5.4. Rensa ”smutsig”-flaggan

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.

För att göra detta kan vi rensa ”smutsig”-flaggan efter att ha visat bilden:

        (gimp-image-clean-all theImage)
      

Detta kommer sätta smutsräkning till 0, vilket får den att verka vara en ren bild.

Huruvida denna rad ska läggas till eller inte beror på personlig smak. Jag använder den i skript som skapar nya bilder, där resultaten är enkla, som i det här fallet. Om ditt skript är väldigt komplicerat, eller om det arbetar på en befintlig bild, så kommer du troligen inte vilja använda denna funktion.