Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Script-fu

Script-fu Predgovor

Predgovor

Ovaj predgovor je napisan za The Gimp 1.1.24. Neke stvari opisane u njemu neće raditi ili će raditi drugačije nego na Gimp 1.0.x.

Uvod

Ovo je kratak uvod o Script-Fu programiranju.Pokušaću da vam pružim kratak uvod u svet Script-Fu-a, i da vam objasnim kako funkcionišu osnovne stvari.Proći ćemo kroz ceo Script-Fu, korak po korak.Cilj je da imamo Script-Fu koji pravi tekst u metal stilu.Predpostavljam da imate osnovno znanje o “Scheme”, jer je to programski jezik koji se koristi u Script-Fu-u.

Prvi korak u Script-Fu

O.K. sada prelazimo na prvi korak: šta želimo da radimo u Script-Fu, prvo ćemo da pokušamo da radimo u Gimp-u.To je veoma važno, jer želimo da znamo tačno koje operacije su nam potrebne, i po kom redu treba da ih pozivamo.

Hajde da napravimo našu test sliku, pre svega ćemo napraviti novu “rgb image” sliku (File->New Image) i ubaciti neki tekst u nju, recimo reč “Test”.

Onda ćemo duplirati tekst i primeniti gradient metala na gornjem sloju..

Zatim ćemo uzeti drugi sloj teksta i malo ga uvećati, a za to ćemo koristiti “alpha-to-selection function” i izabrano povećati za nekoliko piksela.Zatim ćemo to što smo izabrali popuniti sa istim gradientom ali drugačije orijentacije.

Na kraju, spajamo slojeve i nanosimo standardnu “drop shadow”.Kada se sa time završi, uradi ćemo “auto-crop” slike (image) a da bi uklonili sve neželjene delove slike.

Reprodukcija koraka u Script-Fu konzoli

U redu, slika sada izgleda kao što smo i želeli pa hajde da sumiramo korake koje smo načinili.

  1. Napravi novu sliku (image)
  2. Kreiraj sloj teksta (text layer)
  3. Dupliraj sloj teksta
  4. Uvećaj donji sloj teksta
  5. Popunite oba sloja teksta sa gradientom
  6. Spojite slojeve teksta
  7. Nanesite “drop shadow”
  8. Spojite sve slojeve
  9. Auto-crop slike

Sada je zadatak da ponovite ove korake u Script-Fu Console: gde možete da unesete Script-Fu Commands i da ih testirate.Koristite Console za testiranje svih novih funkcija sa kojima niste do kraja upoznati, u Console možete i delimično debagovati vaše skripte.Najlakše je da svaki red teksta pisan za Script-Fu prvo testirate u Console i kada budete sigurni da su ispravni unesete ih u Script-Fu.

Da bi ste to uradili, otvorićemo Script-Fu Console (Xtns->Script-fu->Consol). Kada je otvorimo kliknućemo na Browse... dugme u donjem levom uglu a to će nas dovesti na DB Browser, gde možete tražiti funkcije za pristup Script-Fu-u.Uz ime funkcije dobićete i opis očekivanih argumenata i generalan opis onoga što ta funkcija radi.

Sada je vreme da reprodukujemo naš prvi korak u proces stvaranja slike, pa nam zato treba funkcija za pravljenje nove slike.Većina funkcija koje ćete naći u DB Browser-u ima imena slična onima sadržanim u Gimp menijima.Posle kraćeg traženja “new” našli smo funkciju gimp-image-new, koja zvuči kao ona koju smo i tražili.U konzolu ćemo uneti sledeće:

(gimp-image-new 256 256 RGB)

i dobiti sledeći output:

=> (gimp-image-new 256 256 RGB)

(3)

Prva linija je samo naredba koja je izvršena dok je druga linija povratna vrednost funkcije.Kao što možete da pročitate u DB Browser-u to je ID novo kreirane slike.Možete taj ID jednostavno da koristite kao argument za funkciju u konzoli.Povratna vrednost je prva prepreka na vašem putu po Script-Fu-u.Dolazi kao duga lista od jednog elementa a ne kao “integer” vrednost.Da bi ste iskoristili ovu vrednost moramo uzeti prvi element sa liste a što će nas vratiti na sliku sa ID 3.

Sada se možda pitate gde je slika koju smo napravili zbog toga što ne možete da je vidite.Odgovor je da još ne postoje mogućnosti za njeno prikazivanje, slika se još uvek nalazi u memoriji i ne prikazuje se tako da moramo da napravimo “display” za nju.Zato ćemo probati (gimp-display-new 3), ali nam se prijavljuje greška.

ERROR: Procedural database execution failed:
    (gimp_display_new 3)

Znači to je samo još jedna zamka.Funkcije u okviru Script-Fu-a ne ponašaju se na isti način kao njihove “kolege” u meniju.Ponekad su one na nižem nivou pa je potrebno još dodatnog rada za dobijanje očekivanog rezultata.Ovde je problem da naša novo napravljena slika ne sadrži slojeve uopšte.Da bi se slika prikazala treba nam bar jedan sloj.Tako da je sledeći korak pravljenje slojeva (layer).

=> (gimp-layer-new 3 256 256 RGB-IMAGE "foobar" 100 NORMAL-MODE)

(21)

Primetiće te da su RGB-IMAGE i NORMAL-MODE navedeni kao RGB_IMAGE i NORMAL_MODE u DB Browser (primetite podvučeno '_').Moraćete da zamenite sve podvučeno sa minus '-' u Script-Fu-u svetu.Ako niste sigurni da vam je zamena ispravna, samo unesite “constant” u konzolu.

Sledeći korak je dodavanje novoformiranog sloja slici na način opisan u DB Browser-u:

=> (gimp-image-add-layer 3 21 -1)

()
I sad konačno možemo prikazati našu sliku:
=> (gimp-display-new 3)

(4)

Slika izgleda malo čudno a zato što je popunjena nasumičnim bojama, da bi ih izbrisali popunićemo slojeve trenutnim pozadinskim bojama.

=> (gimp-drawable-fill 21 BG-IMAGE-FILL)

()

Funkcija za popunjavanje slojeva se zove gimp-drawable-fill a ne gimp-layer-fill kao što biste mislili a to je zato što je sloj “drawable”.Tako da ako tražite funkcije za upravljanje slojevima, treba da pogledate i stvari koje upravljaju “drawable”.

Sada imamo našu sliku.Prebrzo za tebe?.Hajde onda da sumiramo i napišemo našu prvu “scheme function”.Prvo sve ubacimo u “let* clause” a zatim dodamo “let* clause” u “function body”:

(define (my-make-new-image)
 (let* ((image (car (gimp-image-new 256 256 RGB)))
        (layer (car (gimp-layer-new image 256 256
                     RGB-IMAGE "foobar" 100 NORMAL-MODE))))
       (gimp-drawable-fill layer BG-IMAGE-FILL)
       (gimp-image-add-layer image layer 0)
       (gimp-display-new image)
       image))

Poslednja linija u šemi funkcije je povratna vrednost, tako da je slika povratna vrednost ove funkcije.

Vratimo se sad našoj “metal-text” stvari, sada treba dodati tekst “string” i zabaviti se sa njime.Malo browsinga po DB-u nas dovodi do gimp-text-fontname. Da bi ga pozvali kucamo:

=> (gimp-text-fontname 3 21 -1 0 "Foobar" 0 TRUE 25 PIXELS
		    "-freefont-blippo-heavy-r-normal-*-24-*-*-*-p-*-iso8859-1")

(33)

I evo ga, imamo tekst na novo formiranom sloju.String "-freefont-blippo-heavy-r-normal-*-24-*-*-*-p-*-iso8859-1" vam može izgledati kao neka crna magija, ali ćemo kasnije videti lakši način da ga napravimo.

Sada moramo duplirati sloj a primetićete da za to nema opcije u DB-u tako da ćemo ručno napisati drugu “scheme function”:

(define (my-duplicate-layer image layer)
	(let* ((dup-layer (car (gimp-layer-copy layer 1))))
              (gimp-image-add-layer image dup-layer 0)
	      dup-layer))
i onda:
=> (my-duplicate-layer 3 34)

41

Sledeći korak je dodavanje malo prostora za povećanje granica teksta, gimp-layer-resize će vam pomoći.

(gimp-layer-resize 41 200 100 5 5)

Ovo radi, ali su visina i širina fiksirane tako da ćemo pokušati ovo na malo fleksibilniji način:

(define (my-layer-add-border layer border)
	(let* ((width  (car (gimp-drawable-width  layer)))
	       (height (car (gimp-drawable-height layer))))
	       (gimp-layer-resize layer
				  (+ width border) (+ height border)
				  (/ border 2) (/ border 2))))

Sada moramo da prebacimo slojeve “alpha cannel” na izabrane i dodamo malo piksela:

(gimp-selection-layer-alpha 41)
(gimp-selection-grow 3 5)

Pre nego što popunite sloj, moramo da uklonimo "Keep trans" zastavicu zbog koje sva providna polja ostaju to i dalje:

(gimp-layer-set-preserve-trans 41 0)

Sada ćemo popuniti izabrano sa gradientom:

(gimp-blend 41 CUSTOM NORMAL LINEAR 100 0 REPEAT-NONE FALSE 0 0 0 0 30 50)

Pisanje niz Script-Fu

Uh, sada imamo sve spremno za Script-Fu samo još treba da sastavimo delove.U sledećim koracima ćemo ukloniti nepotrebne akcije i verovatno dodati nešto novih stvari.

U redu, kako napisati Script-Fu?.Pa u suštini vam trebaju tri stvari.Prva, fajl u kome se nalazi vaša skripta, taj fajl bi trebalo da se nalazi u ~/.gimp-1.1/scripts/. Drugo, funkcija koja obavlja sve akcije vezane za sliku i na kraju vam je potreban poziv upućen script-fu-register da bi vaše skripte bile vidljive unutar Gimp-a.

Zato hajde da napišemo praznu funkciju i da je registrujemo.Trebalo bi da copy-paste sledeći kod u fajl dummy.scm i da ga snimite u ~/.gimp-1.1/scripts/ kao što je gore i opisano.

(define (my-dummy-function a b)
  (print "Do nothing"))

(script-fu-register "my-dummy-function"
		    _"<Toolbox>/Xtns/Script-Fu/My Stuff/Dummy..."
		    "Do nothing"
		    "Joey User"
		    "Joey User"
		    "August 2000"
		    ""
		    SF-ADJUSTMENT _"Width" '(400 1 2000 1 10 0 1)
		    SF-ADJUSTMENT _"Height" '(30 1 2000 1 10 0 1))

Kada pritisnete Xtns->Scritp-fu->Reload vaša skripta će biti uneta u Gimp i biće dostupna iz menija.

Ali obratite pažnju, postoje dve vrste Script-Fu-a.Prva vrsta će napraviti novu sliku koja se koristi za logo i dostupna je kroz meni Xtns->Scritp-fu->..., a druga vrsta će raditi sa postojećom slikom i ova vrsta je dostupna putem desnog klika na pop-up meni na slici Scritp-fu->.... Za registraciju druge vrste Script-Fu-a, morate prilagoditi “path” do <Image>/Script-Fu/... i potrebno je da uzmete dva argumenta SF-IMAGE i SF-DRAWABLE tipa.

Ovo nas dovodi do druge teme, argumenti koje vaša funkcija može da ima a oni sadrže sledeće tipove:

Argument Tip Data Tip Opis
SF-IMAGE Integer (image id) Koristi se za dobijanje ID-a slike
SF-DRAWABLE Integer (drawable id) Nabavite drawable id
SF-VALUE String Input numeričke vrednosti
SF-TOGGLE Boolean (TRUE or FALSE) Input booleon vrednosti
SF-PATTERN String (Pattern name) Omogućava vam da izaberete obrazac
SF-ADJUSTMENT List (start-value min-value max-value small-step large-step [int=0 or float=1] [slider=0 or roll-box=1]) Pravi slider bar ili input box za vrednosti
SF-FILENAME String (pathname) Omogućava vam da potražite datoteku
SF-STRING String Kreira polje za unos
SF-FONT String (fontname) omogićava da izaberete font
SF-COLOR List (red green blue) [0-255] Omogućava vam da izaberete boju
SF-OPTION List of strings Omogućava vam da izaberete stavku van liste
SF-GRADIENT String (gradient name) Omogućava vam da izaberete gradijent

Sledeći kod stvara kutiju sa svim mogućim vrednostima input-a :

(define (my-demo-box value adj1 adj2 image drawable toggle pattern string font color option gradient)
  (print "Do nothing"))

(script-fu-register "my-demo-box"
		    "<Toolbox>/Xtns/Script-Fu/My Stuff/Demo Box..."
		    "Do nothing"
		    "Joe User"
		    "Joe User"
		    "August 2000"
		    ""
		    SF-ADJUSTMENT "SF-ADJUSTMENT (slider)" '( 30 1 2000 1 10 1 0)
		    SF-ADJUSTMENT "SF-ADJUSTMENT"         '(400 1 2000 1 10 1 1)
		    SF-COLOR      "SF-COLOR" '(255 0 255)
		    SF-DRAWABLE   "SF-DRAWABLE" 0
		    SF-FONT       "SF-FONT" ""
		    SF-GRADIENT   "SF-GRADIENT"  "Golden"
		    SF-IMAGE      "SF-IMAGE" 0
		    SF-OPTION     "SF-OPTION" '("Option 1" "Option 2" "Option 3")
		    SF-PATTERN    "SF-PATTERN" "Wood"
		    SF-STRING     "SF-STRING" "Test String"
		    SF-TOGGLE     "SF-TOGGLE" TRUE
		    SF-VALUE      "SF-VALUE" "0"
                    SF-FILENAME   "SF-FILENAME" "/")

Dobijena kutija će izgledati ovako:

Dakle, nazad na posao i hajde da završimo naš primer sa Script-Fu-om.Trebalo bi početi sa radom od okvira, tako da moramo da odlučimo koja nam je vrsta argumenata potrebna.Kako želimo da napravimo font prvo nam je potreban tekst, tako da koristimo SF-STRING, a zatim ćemo koristiti SF-FONT za izbor fonta i dodatnu SF-VALUE za unos veličine fonta.

Pravljenje script-fu-register je ostavljeno kao vežba za korisnike.Ako ne želite sami da ga napravite pogledajte ispod kako izgleda napravljen.Box (kutija) će tada izgledati ovako:

Sada kada smo napravili “register call set up” vreme je da ubacimo neki kod u funkciju.Prvo ubacujemo dve pomoćne funkcije : my-duplicate-layer i my-layer-add-border, na vrh fajla.Sledeće, manje više copy&paste naše Script-Fu Console eksperimente zajedno.Pomeramo gimp-display-new call na kraj funkcije, jer ne moramo da vidimo kako rendering slike funkcioniše.Takođe ćemo dodati još jednu pomoćnu funkciju a koja će konačnu sliku “iseći” na pravu veličinu.Rezultat će biti slika koja bi mogla ovako da izgleda:

(define (my-image-to-layer-size image layer)
  (gimp-layer-set-offsets layer 0 0)
  (gimp-image-resize image
		     (car (gimp-drawable-width layer))
		     (car (gimp-drawable-height layer))
		     0 0))

(define (my-layer-add-border layer border)
	(let* ((width  (car (gimp-drawable-width  layer)))
	       (height (car (gimp-drawable-height layer))))
	       (gimp-layer-resize layer
				  (+ width border) (+ height border)
				  (/ border 2) (/ border 2))))

(define (my-duplicate-layer image layer)
	(let* ((dup-layer (car (gimp-layer-copy layer 1))))
              (gimp-image-add-layer image dup-layer 0)
	      dup-layer))

(define (my-make-metal-font text font font-size)
 (let* ((image (car (gimp-image-new 256 256 RGB)))
	(bottom-font-layer (car (gimp-text-fontname image -1 0 0 text 0 TRUE font-size PIXELS
					     font))))

   (let* ((top-font-layer (my-duplicate-layer image bottom-font-layer)))

     (my-layer-add-border bottom-font-layer 20)

     (gimp-layer-set-preserve-trans bottom-font-layer 0)
     (gimp-gradients-set-active "Four_bars")

     (gimp-selection-layer-alpha bottom-font-layer)
     (gimp-selection-grow image 3)
     (gimp-blend bottom-font-layer CUSTOM NORMAL LINEAR 100 0 REPEAT-NONE FALSE 0 0 0 0 200 50)


     (gimp-selection-layer-alpha top-font-layer)
     (gimp-blend top-font-layer    CUSTOM NORMAL LINEAR 100 0 REPEAT-NONE FALSE 0 0 0 50 200 0)
     (gimp-selection-clear image)

     (let* ((new-layer (car (gimp-image-merge-visible-layers
			     image EXPAND-AS-NECESSARY))))
       (my-image-to-layer-size image new-layer))

     (gimp-display-new image))
   ))

(script-fu-register "my-make-metal-font"
		    "<Toolbox>/Xtns/Script-Fu/Logos/Metal Font..."
		    "Create an example image of a custom gradient"
		    "Federico Mena Quintero"
		    "Federico Mena Quintero"
		    "June 1997"
		    ""
		    SF-STRING     "Text" "The GIMP"
		    SF-FONT       "Font" "-*-blippo-*-r-*-*-24-*-*-*-p-*-*-*"
		    SF-VALUE      "Font Size" "50" )

Uobičajene Zamke

Sledi lista uobičajenih zamki u Script-Fu-u.

Povratne vrednosti

Kada funkcija vraća vrednost, ona će uvek biti zatvorena u listi bez obzira da li se radi samo o jednoj ili više.Čak i ako je povratna vrednost i sama lista kao kad na primer gimp-color-picker, vrati boju, povratna vrednost će uvek biti zatvorena u dodatnoj listi.

Ako se višestruke vrednosti vraćaju i one će biti u obliku listi gde je prva vraćena vrednost prvi element u listi, druga je drugi i tako dalje.Zato morate da uvek dodajete “car call” da bi dobili ispravne vrednosti.

R5SR Compliance

R5SR je dokument koji opisuje jezičke šeme, ali na žalost jezik koji koristi Gimp nije R5SR kompatibilan, nije čak ni blizu.To je zato što Gimp koristi SIOD kao jezički interpretator.SIOD je mala šema za implementaciju, i mana mu je što pruža samo mali skup R5SR funkcija, čak su i neka od imena funkcija promenjena.Na primer nemate “display” samo funkciju pod nazivom “print”.Za kraj priče u šemama funkcija koje podržava Gimp pogledajte na SIOD. web stranu.Da bi stvar bila još gora, Gimp ne omogućava sve funkcije koje se nalaze na SIOD strani, ali može da posluži kao dobra polazna tačka.Takođe možete koristiti “apropos” funkcije u Consoli za traženje specifičnih funkcija.

=> (apropos "write")

(fwrite writes swrite write-mask stroke-overwrite)

Debugging

Kada počnete da se igrate sa Script-Fu-om pa čak i kada se upoznate sa njim, veoma često ćete nailaziti na situacije kada vam scripta neće raditi.Da stvar bude gora, ponekad nećete ni dobiti izveštaj o grešci.U većini slučajeva će razlog biti prost, ali potraga za njim teška. Sledeći koraci bi mogli da vam tu potragu olakšaju.

Prvo proverite da vam je tekst interpunkcijski tačan, a to znači da ste zatvorili sve otvorene zagrade i znake navoda.Tekst editor vam u tome može pomoći.

Drugo, možda ste zaboravili da dodate “car” u neke povratne vrednosti.Da bi izvršili proveru na ove greške copy&paste vaš code u Console i izvršite radnju manuelno.

ERROR: Invalid types specified for arguments

Ovo će biti najčešća poruka koju ćete dobijati a ako dobijete neku drugu vaš “bug” je negde drugde.

Kada pozivate funkciju sa premalo ili previše argumenata, dobićete sledeću poruku o grešci:

=> (gimp-image-get-layers)
ERROR: too few arguments (see errobj)
Onda samo pogledajte u errobj:to će vam reći koji su argumenti bili očekivani a koje ste vi pružili.
=> (print errobj)

((image))
()

Na kraju ako vam funkcija i dalje ne radi, dodajte neke “print calls” na prava mesta da bi ste proverili da li sve radi ispravno.Da bi ste videli svoje snimke morate “provući” Script-Fu kroz Console-u.

Stvari koje ne možete raditi u Script-Fu-u

Do sada sam vam opisivao stvari koje možete raditi u Script-Fu-u a sada ću vam navesti neke koje ne možete.

Prva stvar koju bi ste možda želeli da radite je da dobijete bolje default vrednosti za argumente koje će vaša funkcija dobiti.Loša vest je što to ne možete, možete samo da “pass constant values” u Script-Fu register call.Tako da ako su vaše default vrednosti na primer pola širine slike to ne možete da dobijete možete samo cele vrednosti.

Druga stvar koju bi ste možda želeli je neka vrsta GUI-a koji obuhvata više od onoga što omogućavaju “SF-* values” i ponovo toga nema.”SF-* values” su sav GUI koji možete očekivati od Script-Fu-a.Ako želite komplikovanije stvari, moraćete da napišete pravi Gimp Plug-in.

U nekom trenutku ćete poželeti da napišete vaš filter ili effect, koji zahteva obradu na nivou piksela.To je stvar koju zapravo možete ovde uraditi ali će biti užasno sporo.Tako da će biti bolje da to napišete kao pravi Gimp Plug-in.

Možda ćete želiti da otvorite direktorijum i sve slike u njemu.Ni to nije moguće.SIOD webpage opisuje opendir funkciju, ali kada je probate u Script-Fu-u ona neće raditi kao druge SIOD funkcije.

=> (opendir "/")

ERROR: unbound variable (errobj opendir)

Za rešavanje ovog problema morate da poradite na prebacivanju sadržaja direktorijuma na fajl i čitanje fajla ili da napišete Perl-Fu, Python-Fu ili Gimp Plug-in.

Postoji program pod nazivom gimple u Gnome CVS repositiory koji može da pomogne u rešavanju nekih od ovih pitanja.Gimple je Guile interface za Gimp.Ima bolje podržanu R5SR funkciju od SIOD-a i verovatno će biti u mogućnosti da “ call guile-gtk”, da bi omogućio pravljenje fleksibilnijeg “gui-interfaces” ali je ne znam status ovog programa niti sam ga ikad video na delu.

Examples (primeri)

Uvek je dobra ideja da se pogleda strani Script-Fu.Script-Fu se na primer može naći u Gimp directory /usr/share/gimp/1.1/scripts/. Tu takođe postoje linkovi za druge Script-Fu sajtove na Gimp webpage-u.Ja sam isto tako “upload” svoj Script-fu i to možete pronaći ovde, ali budite pažljivi jer većina nije dokumentovana a neki možda i ne rade.

Reference

ChangeLog

    $Log: script-fu-tut.html,v $
    Revision 1.12  2002/02/21 10:46:10  ingo
    some spelling fixes

    Revision 1.11  2002/01/23 18:18:39  ingo
    applied OSHIRO Naoki's typo patch

    Revision 1.10  2001/11/19 21:33:20  ingo
    *** empty log message ***

    Revision 1.9  2001/11/19 21:30:09  ingo
    added french version link

    Revision 1.8  2001/01/24 21:13:26  ingo
    Added link to japanese translation

    Revision 1.7  2000/08/15 23:57:21  ingo
    Added some examples

    Revision 1.6  2000/08/15 16:13:22  ingo
    Added a describtion of SF-FILENAME

    Revision 1.5  2000/08/15 16:06:41  ingo
    * Some sentences about debugging with (print ...)
    * Moved the changelog to the bottom of the page

    Revision 1.4  2000/08/15 10:24:39  ingo
    Added some infos about things you can't do in Script-Fu

Ovaj tekst je star 10 godina i više up to date informacija možete naći na http://www.gimp.org/docs/script-fu-update.html


Published (Last edited): 26-03-2013 , source: http://seul.org/~grumbel/gimp/script-fu/script-fu-tut.html