Låt oss fortsätta vår träning och lägga till lite funktionalitet till vårt skript.
I den förra lektionen skapade vi en tom funktion och registrerade den i GIMP. I den här lektionen vill vi tillhandahålla funktionalitet i vårt skript — vi vill skapa en ny bild, lägga till användarens text till den och ändra storlek på bilden så att den precis passar texten.
När du vet hur du ska ställa in variabler, definiera funktioner och komma åt listmedlemmar så är det nedförsbacke resten av vägen — allt du behöver göra är att bekanta dig med funktionerna som finns tillgängliga i GIMPs procedurdatabas och anropa dessa funktioner direkt. Öppna 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
.
Som du kan se från databasbläddraren tar funktionen gimp-image-new
tre parametrar — bildens bredd, höjd och bildtypen. Eftersom vi senare kommer ändra storlek på bilden för att passa texten, så kommer vi göra en RGB-bild på 10×10 bildpunkter. Vi kommer lagra bildens bredd och höjd i några variabler också, då vi hänvisar till och manipulerar dem senare i skriptet.
(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.
Du bör också se att vi tog huvudet av resultatet från funktionsanropet. Detta kan verka märkligt, för databasen säger oss explicit att det bara returnerar ett värde — ID för den nyligen skapade bilden. Alla GIMP-funktioner returnerar dock en lista, även om det bara finns ett element i listan, så vi behöver få listans huvud.
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.
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!
Om du försöker stänga den skapade bilden utan att spara filen kommer GIMP fråga dig om du vill spara ditt arbete innan du stänger bilden. Det frågar detta eftersom bilden är markerad som ”smutsig”, eller osparad. I fallet med vårt skript är detta till besvär de gånger vi helt enkelt testkör det och inte lägger till eller ändrar något i den resulterande bilden — det vill säga, vårt arbete är enkelt reproducerbart i ett sådant enkelt skript, så det är rimligt att göra sig av med denna ”smutsig”-flagga.
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.