Obsah
1. Změna základních parametrů kreslicích nástrojů
2. Práce s vlastnostmi vybraného kreslicího nástroje ve skriptech
3. První demonstrační příklad – výběr kreslicího nástroje a jeho parametrů
4. Použití výběrů při kreslení a editaci obrázků
5. Definice hranice výběru pomocí množinových operací a rozmazání jeho hranice
7. Druhý demonstrační příklad – vybarvení vybrané oblasti
8. Obsah dalšího pokračování seriálu
1. Změna základních parametrů kreslicích nástrojů
V dnešní části seriálu o programovacím jazyce Scheme i o jeho použití ve funkci skriptovacího jazyka grafického rastrového editoru GIMP navážeme na obě části předchozí, v nichž jsme si vysvětlili, jakým způsobem je možné ve skriptech používat základní kreslicí nástroje GIMPu i to, jak se tvoří dialogy (formuláře) zobrazené uživateli před vlastním spuštěním skriptu. V těchto dialozích, jež slouží pro interaktivní specifikaci parametrů použitých skriptem, lze používat poměrně velké množství různých ovládacích prvků, jak těch „obyčejných“ (vstupní textové pole, rozbalovací výběrový seznam, checkbox), tak i prvků dostupných pouze v samotném rastrovém editoru GIMP (namíchání barvy z barvové palety, nastavení vlastností kreslicího nástroje atd.). Nejprve si řekněme, jakým způsobem lze ve skriptech využít vlastnosti kreslicích nástrojů zadané uživatelem s využitím dialogů GIMPu.
Obrázek 1: Úvodní dialog prvního demonstračního příkladu popsaného ve třetí kapitole, z něhož je patrné, že lze vybrat jak použitý kreslicí nástroj (listbox Tool), tak i styl kreslení (výběrové tlačítko Browse) a barvu (Color).
V případě, že je do dialogu (formuláře) přiřazeného ke skriptu vložen ovládací prvek typu SF-BRUSH, zobrazí se ve formuláři jako tlačítko s textem „Browse“ nebo lokalizovaným textem s podobným významem, vedle něhož se nachází malý obrázek představující stopu vybraného kreslicího nástroje. Pokud uživatel toto tlačítko stiskne, zobrazí se nový dialog, v němž lze zadat parametry vybraného kreslicího nástroje, především tvar stopy (jedná se o bitmapu pomocí níž je stopa kreslena), přítlak, průhlednost, postupné blednutí barvy s rostoucí délkou stopy atd. Podobným způsobem se chová i ovládací prvek SF-COLOR, po jehož aktivaci se zobrazí nový dialog s možností namíchání barvy z barvové palety. Samotná definice ovládacích prvků v dialogu i způsob jejich ovládání uživatelem je tedy poměrně jednoduchá.
Obrázek 2: Po stisku tlačítka Browse se zobrazí nový dialog s výběrem vlastností kreslicího nástroje.
2. Práce s vlastnostmi vybraného kreslicího nástroje ve skriptech
Poněkud složitější je však zpracování parametrů zadaných uživatelem po zavolání skriptu, především v případě ovládacího prvku SF-BRUSH, protože v příslušném parametru musí být ve strukturované podobě předány všechny zvolené vlastnosti kreslicího nástroje (připomeňme, že každému ovládacímu prvku na formuláři odpovídá pouze jeden parametr skriptu). Barva vybraná ovládacím prvkem SF-COLOR se do skriptu předává jako běžný seznam celočíselných hodnot s rozsahem 0 až 255, takže je velmi jednoduché získat hodnotu jednotlivých barvových složek – červené, zelené a modré (podpora pro další barvové modely je prozatím ještě poněkud problematická). Pokud je například barva předaná v parametru selected-color, lze její jednotlivé barvové složky získat následujícím způsobem:
(set red (car selected-color)) (set green (car (cdr selected-color))) (set blue (car (cdr (cdr selected-color))))
nebo též zkráceně:
(set red (car selected-color)) (set green (cadr selected-color)) (set blue (caddr selected-color))
Ovládací prvek SF-BRUSH taktéž do skriptu předává uživatelem vybrané hodnoty v datové struktuře seznam, ovšem jeho struktura je poněkud složitější. První prvek seznamu obsahuje řetězec s názvem vybrané stopy; tuto hodnotu lze použít například při volání funkce gimp-context-set-brush. Druhým prvkem seznamu je číselná hodnota s průhledností kreslené stopy za níž následují další parametry, především měřítko stopy (jak jsme si již řekli v předchozí kapitole, jedná se o bitmapu, kterou lze v určitém rozsahu zvětšovat a zmenšovat), kreslicí režim aj. Pro přístup k těmto prvkům seznamu lze použít například klasické „lispovské“ funkce typu car a cdr, s nimiž jsme se v tomto seriálu již seznámili při zmínce o historii programovacího jazyka LISP. Ovšem ovládací prvek SF-BRUSH neumožňuje výběr kreslicího nástroje, dovoluje pouze měnit vlastnosti nástroje již vybraného. Pro výběr kreslicího nástroje tedy musíme v dialogu použít jiný ovládací prvek, například běžný výběrový seznam (listbox).
Obrázek 3: Spirála vykreslená prvním demonstračním příkladem pomocí kreslicího nástroje tužka (Pencil).
3. První demonstrační příklad – výběr kreslicího nástroje a jeho parametrů
V dnešním prvním demonstračním příkladu je mj. ukázán způsob použití ovládacích prvků SF-COLOR (výběr barvy v samostatném dialogu), SF-BRUSH (výběr vlastností štětce, taktéž v samostatném dialogu) a SF-OPTION (výběr jedné hodnoty ze seznamu). S využitím prvku SF-OPTION je uživateli nabídnut seznam tří základních kreslicích nástrojů, tj. tužky (pencil), štětce (brush) a rozprašovače (airbrush). Vlastní vykreslení úsečky, ze které se skládá spirála, podobně jako v demonstračních příkladech uvedených v předchozí části tohoto seriálu, je realizováno v pomocné funkci draw-line na základě pořadového čísla vybraného kreslicího nástroje. Vzhledem k tomu, že položky ve výběrovém seznamu SF-OPTION jsou číslovány od nuly, odpovídá tužka hodnotě nula, štětec hodnotě jedna a rozprašovač hodnotě dvě. Povšimněte si, že pro každý kreslicí nástroj existuje samostatná funkce, která kreslení provádí – gimp-pencil, gimp-paintbrush-default a gimp-airbrush-default:
; vykreslení úsečky vybraným kreslicím nástrojem ; 0 - tužka ; 1 - štětec ; 2 - rozprašovač (define (draw-line tool selected-layer npoint segment) (if (= tool 0) (gimp-pencil selected-layer npoint segment) (if (= tool 1) (gimp-paintbrush-default selected-layer npoint segment) (gimp-airbrush-default selected-layer npoint segment) ) ) )
Obrázek 4: Spirála vykreslená nástrojem štětec (Brush).
Následuje výpis zdrojového kódu prvního demonstračního příkladu:
; Skriptování v GIMPu (3) ; Demonstrační příklad číslo 1 ; Tato funkce je zavolána z dialogu vyvolaného uživatelem ; z grafického uživatelského rozhraní GIMPu. (define (script-fu-spirals-4 selected-image selected-layer selected-spins center-x center-y start-radius end-radius start-angle tool selected-brush selected-color) ; pomocná funkce pro výpočet jedné souřadnice ; bodu ležícího na spirále (define (coord center radius function angle start-angle) (+ center (* radius (function (+ angle start-angle)))) ) ; vykreslení úsečky vybraným kreslicím nástrojem (define (draw-line tool selected-layer npoint segment) (if (= tool 0) (gimp-pencil selected-layer npoint segment) (if (= tool 1) (gimp-paintbrush-default selected-layer npoint segment) (gimp-airbrush-default selected-layer npoint segment) ) ) ) ; definice lokálních proměnných (let* ( ; konstanta - počet vrcholů křivky ; na jednu otočku spirály (vertexes-per-spin 100) ; počet prvků vektoru = (x1, y1, x2, y2) (npoint 4) ; vykreslovaná úsečka je představována vektorem ; (vektorem je v tomto kontextu myšlena datová ; struktura programovacího jazyka Scheme) (segment (make-vector 4 )) ; úhly zvětšující se pro každý další vykreslený úsek (alfa 0) (beta 0) ; konstanta - 2xPi (full-circle (* 3.1415927 2)) ; počet vykreslených segmentů (step (/ full-circle vertexes-per-spin)) ; úprava hodnoty zadané uživatelem (spins (+ selected-spins 1)) ; vzdálenost vykreslovaného úseku od středu spirály (radius start-radius) (old-radius radius) ; změna vzdálenosti pro každý další úsek (radius-delta (/ (- end-radius start-radius) (* vertexes-per-spin spins 1))) ) (gimp-context-push) (gimp-undo-push-group-start selected-image) ; nastavení způsobu kreslení na základě údajů zadaných uživatelem (gimp-context-set-foreground selected-color) (gimp-context-set-brush (car selected-brush)) (gimp-context-set-opacity (car (cdr selected-brush))) (gimp-context-set-paint-mode (car (cdr (cdr (cdr selected-brush))))) ; programová smyčka, v níž se vykreslí úsečkové segmenty ; ze kterých se skládá aproximace spirály (while (<= alfa (* full-circle spins 1)) (set! beta (+ alfa step)) (set! radius (+ radius radius-delta)) ; vypočet počáteční a koncové souřadice úsečky (vector-set! segment 0 (coord center-x old-radius cos alfa start-angle) ) (vector-set! segment 1 (coord center-y old-radius sin alfa start-angle) ) (vector-set! segment 2 (coord center-x radius cos beta start-angle) ) (vector-set! segment 3 (coord center-y radius sin beta start-angle) ) ; vykreslení úsečky vybraným kreslicím nástrojem (draw-line tool selected-layer npoint segment) ; přinutíme GIMP, aby obrázek průběžně vykresloval (gimp-displays-flush) ; přechod na další úsek (set! alfa beta) (set! old-radius radius) ) ; uložíme stav obrázku na zásobník (gimp-undo-push-group-end selected-image) ) (gimp-context-pop) ; naposledy přinutíme GIMP, aby finální obrázek vykreslil (gimp-displays-flush) ) ; základní informace o skriptu a definice dialogu ; zobrazeného uživateli (script-fu-register "script-fu-spirals-4" _"_Spirals-4" _"Renders various spirals to current layer" "Pavel Tisnovsky" "Pavel Tisnovsky" "2010-05-18" "RGB*, INDEXED*, GRAY*" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-OPTION _"Spins" '(_"1" _"2" _"3" _"4") SF-ADJUSTMENT _"X center" '(200 0 999 1 10 0 1) SF-ADJUSTMENT _"Y center" '(200 0 999 1 10 0 1) SF-ADJUSTMENT _"Start radius" '(20 0 999 1 10 0 1) SF-ADJUSTMENT _"End radius" '(180 0 999 1 10 0 1) SF-ADJUSTMENT _"Start angle" '(0 0 359 1 10 0 0) SF-OPTION _"Tool" '(_"Pencil" _"Brush" _"Airbrush") SF-BRUSH _"Brush" '("Circle (01)" 1.0 -1 0) SF-COLOR _"Color" "black" ) ; registrace skriptu do menu (script-fu-menu-register "script-fu-spirals-4" "<Image>/Root.cz") ; finito
Obrázek 5: Spirála vykreslená nástrojem rozprašovač (Airbrush).
4. Použití výběrů při kreslení a editaci obrázků
Při kreslení složitějších objektů v grafickém editoru GIMP nebo při editacích obrázků (včetně aplikace filtrů) je možné využívat i takzvané výběry (selection) nebo cesty (paths). Nejprve si ukažme, jakým způsobem je možné pracovat s výběry. Uživatel má při interaktivní editaci obrázků k dispozici hned několik nástrojů, pomocí kterých může vybírat a následně upravovat oblasti v rastrovém obrázku, se kterými je možné posléze provádět poměrně velké množství editačních operací – například je lze použít jako masku při všech editačních operacích (tuto masku lze zobrazit a popř. zase skrýt příkazem Select/Toggle Quick Mask nebo klávesovou zkratkou CTRL+Q), výběry je možné zkonvertovat na cesty (Select/To Path) nebo je převést na kanály (Select/Save to Channel) a následně uložit do seznamu kanálů přiřazených ke zpracovávanému obrázku. Hranici výběru je možné taktéž přímo vykreslit právě nastaveným kreslicím nástrojem (Selection Editor/Stroke).
Obrázek 6: Vytvoření výběru ze dvou sjednocených kružnic, od nichž byla odečtena plocha ve tvaru obdélníku.
5. Definice hranice výběru pomocí množinových operací a rozmazání jeho hranice
Samotné výběry se definují pomocí základních geometrických tvarů (obdélník/čtverec, elipsa/kružnice), ručním nakreslením hranice výběru, nástrojem, který automaticky vybere oblast podle barevných ploch v obrázku nebo podle změny kontrastu atd. To ovšem není zdaleka vše – při tvorbě výběrů lze aplikovat i základní množinové operace (sjednocení, rozdíl, doplněk), takže je například možné vytvořit výběr ze dvou sjednocených kruhů, od nichž je „odečtena“ plocha ve tvaru obdélníka – viz též obrázek číslo 6 i obrázek číslo 7. Pro volbu těchto dvou množinových operací se používají modifikátory CTRL a SHIFT (musí se stlačit před vlastním nakreslením hranice výběru, v průběhu kreslení totiž mají tyto klávesy jiný význam), doplněk (inverzi) lze vyvolat buď klávesovou zkratkou CTRL+I nebo příkazem Select/Invert.
Obrázek 7: Zobrazení výběru jako takzvané rychlé masky (quick mask).
Při úpravách plnobarevných obrázků, zvláště při editaci fotografií, bývá vhodné hranice výběru rozmazat, takže se například při vyplňování oblasti výběru použije v okolí jeho hranice postupný gradientní přechod od výplňové barvy k barvě pozadí (stejný přechod je aplikován i při posunu nebo kopii části obrázku). Interně je rozmazání hranice výběru řešeno aplikací Gaussovského filtru na bitmapu představující vybraný vzorek, což je nejlépe patrné při zobrazení výběru jako rychlé masky (Quick Mask). Rozmazání hranice výběru je ukázáno na obrázku 8 a 9.
Obrázek 8: Rozmazání hranice výběru nástrojem Feather.
Obrázek 9: Zobrazení výběru s rozmazanou hranicí v režimu rychlé masky.
6. Práce s výběry ve skriptu
Prakticky všechny operace s výběry, které může interaktivně provádět uživatel při úpravách obrázku, lze implementovat i ve skriptech. Pro tyto účely nabízí grafický editor GIMP poměrně velké množství různých funkcí, z nichž některé (pravděpodobně ty nejpoužívanější) jsou vypsány v následujících tabulkách. V první tabulce jsou vypsány operace použitelné pro vlastní definici oblasti výběru:
Název funkce | Význam |
---|---|
gimp-rect-select | výběr obdélníkové oblasti |
gimp-round-rect-select | výběr oblasti ve tvaru obdélníka se zaoblenými rohy |
gimp-ellipse-select | výběr oblasti ve tvaru elipsy nebo kružnice |
gimp-free-select | výběr polygonální oblasti |
gimp-fuzzy-select | výběr oblasti na základě podobnosti barev sousedních pixelů |
gimp-by-color-select | výběr všech pixelů stejné či podobné barvy |
Obrázek 10: Dialog zobrazený při spuštění druhého demonstračního příkladu.
Následuje výpis některých funkcí, které je možné aplikovat na již vytvořený výběr:
Název funkce | Význam |
---|---|
gimp-edit-clear | vymazání výběru |
gimp-edit-copy | kopie výběru do interního bufferu |
gimp-edit-cut | provedení předchozích dvou příkazů |
gimp-edit-paste | vložení výběru z interního bufferu do obrázku |
gimp-edit-stroke | obtažení hranice výběru zvoleným kreslicím nástrojem |
gimp-edit-fill | vyplnění vybrané oblasti |
gimp-selection-save | uložení výběru do kanálu |
gimp-selection-none | zrušení výběru |
Obrázek 11: Před spuštěním druhého demonstračního příkladu je obrázek prázdný (takže pokud zde vidíte prázdnou plochu, je to zcela v pořádku).
7. Druhý demonstrační příklad – vybarvení vybrané oblasti
Některé z funkcí, které byly vypsány v předchozí kapitole, jsou použity i v dnešním druhém demonstračním příkladu. Tento příklad po svém spuštění nabídne uživateli dialog (formulář), ve kterém je možné zadat barvu výplně a šířku oblasti rozmazání hranice výběru (navíc lze pomocí checkboxu povolit či naopak zakázat použití rozmazání hranice výběru). Po stisku tlačítka OK nejprve skript vytvoří výběr ve tvaru čtverce, jehož protilehlé rohy leží na souřadnicích [150, 150] a [250, 250], tj. ve středu obrázku o rozměrech 400×400 pixelů. Následně se k tomuto čtverci pomocí množinové operace sjednocení přidají další dvě oblasti, každá ve tvaru kružnice o poloměru 100 pixelů. Posléze je plocha výběru vybarvena barvou vybranou na dialogu a v posledním kroku je výběr z obrázku odstraněn (ovšem lze ho jednoduše obnovit klávesovou zkratkou CTRL+Z, která vrátí poslední provedenou operaci). Povšimněte si především toho, jaké parametry jsou předávány funkcím gimp-rect-select a gimp-ellipse-select. Kromě samotného tvaru výběru (jeho rozměrech a poloze počátečního bodu) je nutné specifikovat požadovanou množinovou operaci a taktéž parametry pro rozmazání hranice výběru.
Obrázek 12: Vybarvení oblasti výběru modrou barvou. Šířka rozmazání hranice výběru byla nastavena na velmi vysokou hodnotu (více než 20 pixelů).
Zdrojový kód druhého demonstračního příkladu má tvar:
; Skriptování v GIMPu (3) ; Demonstrační příklad číslo 2 ; Tato funkce je zavolána z dialogu vyvolaného uživatelem ; z grafického uživatelského rozhraní GIMPu. (define (script-draw-selection selected-image selected-layer selected-color use-feather feather-radius) ; vytvoření výběru ve tvaru čtverce (gimp-rect-select selected-image ; obrázek v němž se výběr vytvoří 150 150 100 100 ; rozměry výběru REPLACE ; přepsání oblasti původního výběru use-feather feather-radius) ; rozmazání hranice výběru ; přidání dalšího výběru ve tvaru kružnice (gimp-ellipse-select selected-image ; obrázek v němž se výběr vytvoří 80 80 100 100 ; rozměry výběru ADD FALSE ; přidání oblasti ke stávajícímu výběru use-feather feather-radius) ; rozmazání hranice výběru ; přidání dalšího výběru ve tvaru kružnice (gimp-ellipse-select selected-image ; obrázek v němž se výběr vytvoří 220 220 100 100 ; rozměry výběru ADD FALSE ; přidání oblasti ke stávajícímu výběru use-feather feather-radius) ; rozmazání hranice výběru ; volba barvy v paletě (gimp-palette-set-background selected-color) ; vykreslení obrazce - jeho výplň (gimp-edit-fill selected-layer BG-IMAGE-FILL) ; zrušení výběru (lze vrátit pomocí CTRL+Z) (gimp-selection-none selected-image) ; přinutíme GIMP, aby finální obrázek vykreslil (gimp-displays-flush) ) ; základní informace o skriptu a definice dialogu ; zobrazeného uživateli (script-fu-register "script-draw-selection" _"_Draw selection" _"Draws geometric shape using selection to current layer" "Pavel Tisnovsky" "Pavel Tisnovsky" "2010-05-18" "RGB*, INDEXED*, GRAY*" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-COLOR _"Color" "black" SF-TOGGLE _"Feather" FALSE SF-ADJUSTMENT _"Feather radius" '(10 1 100 1 10 0 0) ) ; registrace skriptu do menu (script-fu-menu-register "script-draw-selection" "<Image>/Root.cz") ; finito
Obrázek 13: Druhý demonstrační příklad byl spuštěn znovu na tom samém obrázku. Druhá vyplněná oblast (tentokrát s použitím žluté barvy) má šířku rozmazané hranice již menší – 10 pixelů.
Obrázek 14: Třetí spuštění demonstračního příkladu – přes žlutý obrazec byl nakreslen obrazec modrý, ovšem šířka rozmazání hranice výběru byla snížena na pět pixelů.
8. Obsah dalšího pokračování seriálu
V následující části tohoto seriálu se zaměříme na dvě poměrně rozsáhlé a přitom důležité oblasti funkcionality rastrového grafického editoru GIMP. Jedná se o práci s vrstvami a taktéž o použití různých filtrů, které tento grafický editor svým uživatelům nabízí. Právě s využitím těchto dvou nástrojů lze tvořit i velmi komplikované skripty, z nichž mnohé jsou dostupné již v základní instalaci GIMPu v menu Filters. Výsledek práce jednoho relativně jednoduchého skriptu využívajícího vrstvy a filtry, je zobrazen na obrázku číslo 15.
Obrázek 15: Výsledek činnosti poměrně jednoduchého skriptu, který nejprve na náhodných pozicích vykreslil několik hvězd (modifikací barev jednotlivých pixelů, tj. metodou, kterou jsme si již popsali předminule) a posléze použil Gaussovy filtry na jejich rozmazání.
9. Odkazy na Internetu
- A Script-Fu Tutorial
http://www.linuxtopia.org/online_books/graphics_tools/gimp_user_manual/en/gimp-using-script-fu-tutorial.html - A Script-Fu Tutorial
http://docs.gimp.org/en/gimp-using-script-fu-tutorial.html - Script-fu Tutorial
http://www.seul.org/~grumbel/gimp/script-fu/script-fu-tut.html - Lambda calculus
http://en.wikipedia.org/wiki/Lambda_calculus - A Short Introduction to the Lambda Calculus
http://www.cs.bham.ac.uk/~axj/pub/papers/lambda-calculus.pdf - A Tutorial Introduction to the Lambda Calculus
http://www.inf.fu-berlin.de/lehre/WS03/alpi/lambda.pdf - (welcome '(schemers . org))
http://www.schemers.org/ - Revised5 Report on the Algorithmic Language Scheme
http://www.schemers.org/Documents/Standards/R5RS/ - The Revised6 Report on the Algorithmic Language Scheme
http://www.r6rs.org/ - Scheme
http://groups.csail.mit.edu/mac/projects/scheme/ - The Kawa language framework
http://www.gnu.org/software/kawa/ - Scheme 48
http://s48.org/ - Introductory textbooks for Schemers
http://www.schemers.org/Documents/#intro-texts - Scheme (programming language)
http://en.wikipedia.org/wiki/Scheme_(programming_language) - Scheme
http://cs.wikipedia.org/wiki/Scheme - Scheme-faq
http://community.schemewiki.org/?scheme-faq - Scheme implementations
http://community.schemewiki.org/?scheme-faq-standards#implementations - Successful Scheme
http://www.itworld.com/swol-1013-regex - Guy L. Steele, Jr.
http://en.wikipedia.org/wiki/Guy_L._Steele - Gerald Jay Sussman
http://en.wikipedia.org/wiki/Gerald_Jay_Sussman - PLT Scheme
http://www.plt-scheme.org/ - Quick: An Introduction to PLT Scheme with Pictures
http://docs.plt-scheme.org/quick/ - PLT Scheme
http://en.wikipedia.org/wiki/Plt_scheme - PLT Scheme Guide
http://docs.plt-scheme.org/guide/ - The DrScheme Project: An Overview
http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.22.9543 - DrScheme
http://en.wikipedia.org/wiki/DrScheme - How to Design Programs
http://www.htdp.org/ - An Introduction to Scheme
http://www.acm.org/crossroads/xrds1–2/scheme.html