Ve čtvrté části článku o tvorbě pluginů určených pro známý bitmapový grafický editor GIMP si ukážeme práci s výběry (selections) i to, jakým způsobem se výběry mohou použít ve skriptech naprogramovaných ve Scheme (script-fu) či v Pythonu (Python-fu).
Obsah
1. Použití výběrů (selection) při kreslení a editaci obrázků
2. Definice hranice výběru s využitím množinových operací
5. Operace aplikovatelné na již vytvořený výběr
6. Nastavení rozmazání hranice výběru ve skriptu
7. První demonstrační příklad – vykreslení kružnice do obrázku
8. Úplný zdrojový kód prvního demonstračního příkladu
9. Druhý demonstrační příklad – vybarvení vybrané oblasti
10. Úplný zdrojový kód druhého demonstračního příkladu
12. Úplný zdrojový kód třetího demonstračního příkladu
13. Repositář s demonstračními příklady
1. Použití výběrů (selection) 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 různých typů filtrů) je možné využívat i takzvané výběry (selection) nebo alternativně 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. Nejčastěji používané nástroje nalezneme v toolboxu GIMPu; konkrétně se jedná o prvních sedm ikon:
Obrázek 1: Toolbox rastrového grafického editoru GIMP. Prvních sedm ikon (na prvním řádku) slouží k výběru jednoho z nástrojů pro výběr regionu obrázku.
Způsob použití těchto nástrojů z hlediska uživatele (nikoli programátora pluginů) je podrobně popsán na stránce https://docs.gimp.org/en/gimp-tools-selection.html popř. ve zkrácené podobě na stránce https://www.thoughtco.com/how-to-make-selections-in-gimp-1701663. S výběry je posléze 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.
Obrázek 2: Základní nástroj pro výběr části obrázku. Vybraná oblast má tvar kružnice nebo elipsy.
Tuto masku lze v případě potřeby 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 3: Zobrazení výběru příkazem Select/Toggle Quick Mask.
2. Definice hranice výběru s využitím množinových operací
Samotné výběry se v nejjednodušším případě definují s využitím základních geometrických tvarů (obdélník/čtverec, elipsa/kružnice), dále pak 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., viz též obrázek číslo jedna s nabídkou těchto nástrojů. To ovšem není zdaleka vše – při tvorbě výběrů je totiž možné 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 následně „odečtena“ plocha ve tvaru obdélníka – viz též screenshoty zobrazené v předchozí kapitole i v této kapitole:
Obrázek 4: Vytvoření výběru z několika sjednocených kružnic a obdélníku. Od výběru byl následně „odečten“ jiný obdélník.
Pro volbu těchto dvou množinových operací se používají klávesové modifikátory CTRL a SHIFT. Ty se musí 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, umožňují například kreslit přesné kružnice nebo přesné čtverce. Doplněk (inverzi) lze vyvolat buď klávesovou zkratkou CTRL+I nebo příkazem Select/Invert.
Obrázek 5: Tentýž výběr, ovšem zobrazený pomocí rychlé masky. Povšimněte si ostré hranice výběru (hranice má šířku jednoho pixelu).
3. Rozmazání hranice výběrů
Při úpravách plnobarevných (tj. truecolor) obrázků, například 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 ovšem aplikován i při posunu nebo kopii části obrázku, což vede k tvorbě zajímavých efektů). Interně je rozmazání hranice výběru řešeno aplikací takzvaného 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 následujících dvou screenshotech získaných z GIMPu. První screenshot zobrazuje běžný výběr (způsob zobrazení posunujícími se čárkami se nazývá „marching arms“ podle podoby s pochodujícími mravenci), druhý pak výběr zobrazený v režimu rychlé masky:
Obrázek 6: Rozmazání hranice výběru nástrojem Feather.
Obrázek 7: Zobrazení výběru s rozmazanou hranicí v režimu rychlé masky. Povšimněte si postupného přechodu hranice výběru.
4. Výběr oblasti ve skriptu
Prakticky všechny operace s výběry, které může interaktivně provádět uživatel při úpravách rastrového obrázku, je samozřejmě možné implementovat i ve skriptech, ať již napsaných v programovacím jazyku Scheme či v Pythonu. 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 můžeme najít operace použitelné pro vlastní definici oblasti výběru:
Název funkce | Význam |
---|---|
gimp-image-select-rectangle | výběr obdélníkové oblasti |
gimp-image-select-round-rectangle | výběr oblasti ve tvaru obdélníka se zaoblenými rohy |
gimp-image-select-ellipse | výběr oblasti ve tvaru elipsy nebo kružnice |
gimp-image-select-polygon | výběr oblasti ve tvaru mnohoúhelníku |
gimp-image-select-color | výběr všech pixelů stejné či podobné barvy |
gimp-image-select-contiguous-color | výběr oblasti na základě podobnosti barev sousedních pixelů |
Poznámka: všechny funkce jsou pojmenovány podle zvyklostí panujících v komunitě programovacích jazyků Clojure, LISP a Scheme, tj. jednotlivá slova jsou oddělena znakem pomlčky. Při zápisu těchto funkcí v Pythonu je nutné pomlčky nahradit za podtržítka.
Obrázek 8: Nápověda k funkcím vypsaným v předchozí tabulce je přímo součástí GIMPu. S touto nápovědou jsme se již setkali v úvodní části tohoto seriálu.
5. Operace aplikovatelné na již vytvořený výběr
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ů současně: copy a potom clear |
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 |
Poznámka: pravidla pro pojmenování funkcí jsou stejná, jako tomu bylo v předchozí kapitole.
Obrázek 9: Nápověda k funkci gimp-selection-save zmíněné v předchozí tabulce.
6. Nastavení rozmazání hranice výběru ve skriptu
Pro nastavení rozmazání výběru („feather“) jsou k dispozici tyto dvě funkce:
Název funkce | Význam |
---|---|
gimp-context-set-feather | povolení či zákaz rozmazání (jako parametr se předává hodnota TRUE či FALSE) |
gimp-context-set-feather-radius | specifikace šířky „rozmazané hranice“, uvádí se v horizontálním i vertikálním směru |
Poznámka: funkce gimp-context-set-feather-radius se ve starších verzích GIMPu chovala odlišně, neboť akceptovala jen jediný parametr. Dnes se jí předávají parametry dva.
7. První demonstrační příklad – vykreslení kružnice do obrázku
V prvním demonstračním příkladu, který je vytvořen v programovacím jazyku Scheme, si ukážeme, jakým způsobem lze do nově vytvořeného obrázku vykreslit vyplněnou kružnici. Grafický editor GIMP sice na první pohled nástroj na kreslení kružnice neobsahuje, ovšem není to nutné a to právě díky tomu, že si můžeme vytvořit výběr prakticky libovolného tvaru a následně ho vyplnit konstantní barvou, gradientním přechodem nebo texturou. Vraťme se však ke zdrojovému kódu demonstračního příkladu. V něm se nejprve vytvoří nový obrázek s novou hladinou postupem, který již dobře známe z předchozích částí tohoto seriálu:
; vytvoření nového obrázku, jehož ID se uloží
; do proměnné nazvané "image"
(image (car (gimp-image-new image-width image-height RGB)))
; vytvoření nové hladiny, jejíž ID se uloží
; do proměnné nazvané "layer"
(layer (car (gimp-layer-new image image-width image-height RGB-IMAGE "Circle" 100 NORMAL-MODE))))
; přidání hladiny do vytvořeného obrázku
(gimp-image-add-layer image layer 0)
Novou hladinu následně vyplníme vybranou barvou pozadí:
; volba barvy v paletě
(gimp-palette-set-background background-color)
; vykreslení obrazce - jeho výplň
(gimp-edit-fill layer BG-IMAGE-FILL)
Dále již následuje vytvoření vlastního výběru (selection). Funkci gimp-image-select-ellipse se předává šest parametrů:
- Specifikace obrázku
- Specifikace prováděné operace: vytvoření nového výběru, přidání tvaru k existujícímu výběru atd.
- Levý horní roh (odpovídá vytvoření výběru pomocí myši)
- Rozměry výběru (opět odpovídá vytvoření výběru pomocí myši)
My vyžadujeme, aby se kružnice vytvořila uprostřed obrázku, takže je nutné vypočítat pozici levého horního rohu i rozměry kružnice. Celé volání funkce gimp-image-select-ellipse vypadá následovně:
; vytvoření výběru ve tvaru kružnice
(gimp-image-select-ellipse
image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-REPLACE ; přepsání oblasti původního výběru
(- (/ image-width 2) radius) ; levý horní roh výběru
(- (/ image-height 2) radius)
(* 2 radius) (* 2 radius)) ; rozměry výběru
Následující příkaz pouze nastaví novou barvu pozadí, opět na základě výběru provedeného samotným uživatelem:
; volba barvy v paletě
(gimp-palette-set-background selected-color)
Následuje vyplnění výběru konstantní barvou. Tuto funkci jsme již volali na začátku pro vyplnění celé hladiny, nyní je ovšem aktivní výběr a tudíž se vyplní skutečně jen vybraná část (kružnice):
; vykreslení obrazce - jeho výplň
(gimp-edit-fill layer BG-IMAGE-FILL)
Nakonec výběr zrušíme, aby jeho zobrazení nerušilo dojem z výsledného obrázku:
; zrušení výběru (lze vrátit pomocí CTRL+Z)
(gimp-selection-none image)
Obrázek 10: Výsledný obrázek získaný po spuštění prvního demonstračního příkladu.
Zbývá nám už jen doplnit maličkost, konkrétně deklarovat dialog zobrazený pro vyvolání pluginu a taktéž určit, do jakého menu se má položka pro spuštění pluginu doplnit. V dialogu bude možné nastavit rozměry nového obrázku, poloměr vykreslované kružnice, barvu této kružnice a barvu pozadí:
(script-fu-register "script-draw-circle"
"<Image>/Filters/Render/Pattern/Circle"
"Vytvori novy obrazek a v nem nakresli kruznici."
"Pavel Tisnovsky"
"Pavel Tisnovsky"
"2017-05-04"
""
SF-ADJUSTMENT "Image width" '(256 16 8192 16 64 0 1)
SF-ADJUSTMENT "Image height" '(256 16 8192 16 64 0 1)
SF-ADJUSTMENT "Radius" '(50 16 200 16 64 0 1)
SF-COLOR "Color" "yellow"
SF-COLOR "Background" "black")
Obrázek 11: Dialog prvního demonstračního příkladu deklarovaný předchozím zápisem script-fu-register.
8. Úplný zdrojový kód prvního demonstračního příkladu
Úplný zdrojový kód dnešního prvního demonstračního příkladu vypadá následovně:
; Tato funkce je zavolána z dialogu vyvolaného uživatelem
; z grafického uživatelského rozhraní GIMPu.
(define (script-draw-circle image-width image-height radius selected-color background-color)
(let*
(
; vytvoření nového obrázku, jehož ID se uloží
; do proměnné nazvané "image"
(image (car (gimp-image-new image-width image-height RGB)))
; vytvoření nové hladiny, jejíž ID se uloží
; do proměnné nazvané "layer"
(layer (car (gimp-layer-new image image-width image-height RGB-IMAGE "Circle" 100 NORMAL-MODE))))
; přidání hladiny do vytvořeného obrázku
(gimp-image-add-layer image layer 0)
; volba barvy v paletě
(gimp-palette-set-background background-color)
; vykreslení obrazce - jeho výplň
(gimp-edit-fill layer BG-IMAGE-FILL)
; vytvoření výběru ve tvaru kružnice
(gimp-image-select-ellipse
image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-REPLACE ; přepsání oblasti původního výběru
(- (/ image-width 2) radius) ; levý horní roh výběru
(- (/ image-height 2) radius)
(* 2 radius) (* 2 radius)) ; rozměry výběru
; volba barvy v paletě
(gimp-palette-set-background selected-color)
; vykreslení obrazce - jeho výplň
(gimp-edit-fill layer BG-IMAGE-FILL)
; zrušení výběru (lze vrátit pomocí CTRL+Z)
(gimp-selection-none image)
; zobrazení právě vytvořeného obrázku
(gimp-display-new 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-circle"
"<Image>/Filters/Render/Pattern/Circle"
"Vytvori novy obrazek a v nem nakresli kruznici."
"Pavel Tisnovsky"
"Pavel Tisnovsky"
"2017-05-04"
""
SF-ADJUSTMENT "Image width" '(256 16 8192 16 64 0 1)
SF-ADJUSTMENT "Image height" '(256 16 8192 16 64 0 1)
SF-ADJUSTMENT "Radius" '(50 16 200 16 64 0 1)
SF-COLOR "Color" "yellow"
SF-COLOR "Background" "black")
; finito
Kopie zdrojového kódu pluginu uložte do adresáře ~/.gimp-2.x/scripts, kde x je číslo verze GIMPu. Pro jistotu si zkontrolujte, zda se tento adresář skutečně používá. Pokud nebude skript nalezen, lze vyvolat příkaz Filters → Script-Fu → Refresh Scripts a sledovat případná chybová hlášení.
9. Druhý demonstrační příklad – vybarvení vybrané oblasti
Některé z funkcí, které byly vypsány v předchozích kapitolách, jsou použity i v dnešním druhém demonstračním příkladu, který ovšem již nevytváří nový obrázek, ale provádí vykreslování do obrázku existujícího. 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ů.
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ů).
Následně se k tomuto čtverci s využitím 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-image-select-rectangle a gimp-image-select-ellipse. 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:
; vytvoření výběru ve tvaru čtverce
(gimp-image-select-rectangle
selected-image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-REPLACE ; přepsání oblasti původního výběru
150 150 100 100) ; rozměry výběru
Obě kružnice se přidávají k již existujícímu výběru a proto použijeme operaci CHANNEL-OK-ADD (je to divné, ale skutečně názvy těchto konstant začínají slovem CHANNEL):
; přidání dalšího výběru ve tvaru kružnice
(gimp-image-select-ellipse
selected-image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-ADD ; přidání oblasti ke stávajícímu výběru
80 80 100 100) ; rozměry výběru
; přidání dalšího výběru ve tvaru kružnice
(gimp-image-select-ellipse
selected-image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-ADD ; přidání oblasti ke stávajícímu výběru
220 220 100 100) ; rozměry výběru
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ů.
Samozřejmě došlo ke změně dialogu, který se zobrazí po spuštění demonstračního příkladu, protože je nutné specifikovat jiné parametry:
(script-fu-register "script-draw-selection"
"<Image>/Filters/Render/Pattern/Selection"
"Vykresli komplikovanejsi obrazec pomoci vyberu"
"Pavel Tisnovsky"
"Pavel Tisnovsky"
"2017-05-05"
"RGB*, INDEXED*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-COLOR "Color" "yellow"
SF-TOGGLE "Feather" FALSE
SF-ADJUSTMENT "Feather radius" '(10 1 100 1 10 0 0))
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ů.
10. Úplný zdrojový kód druhého demonstračního příkladu
Úplný zdrojový kód dnešního druhého demonstračního příkladu vypadá následovně:
; 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
selection-color
use-feather
feather-radius)
; nastaveni rozmazani
(gimp-context-set-feather use-feather)
(gimp-context-set-feather-radius feather-radius feather-radius)
; vytvoření výběru ve tvaru čtverce
(gimp-image-select-rectangle
selected-image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-REPLACE ; přepsání oblasti původního výběru
150 150 100 100) ; rozměry výběru
; přidání dalšího výběru ve tvaru kružnice
(gimp-image-select-ellipse
selected-image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-ADD ; přidání oblasti ke stávajícímu výběru
80 80 100 100) ; rozměry výběru
; přidání dalšího výběru ve tvaru kružnice
(gimp-image-select-ellipse
selected-image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-ADD ; přidání oblasti ke stávajícímu výběru
220 220 100 100) ; rozměry výběru
; volba barvy v paletě
(gimp-palette-set-background selection-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"
"<Image>/Filters/Render/Pattern/Selection"
"Vykresli komplikovanejsi obrazec pomoci vyberu"
"Pavel Tisnovsky"
"Pavel Tisnovsky"
"2017-05-05"
"RGB*, INDEXED*, GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-COLOR "Color" "yellow"
SF-TOGGLE "Feather" FALSE
SF-ADJUSTMENT "Feather radius" '(10 1 100 1 10 0 0))
; finito
Obrázek 15: Další možná kombinace – vyplnění výběru konstantní modrou barvou a následné vyplnění barvou žlutou, ovšem s velkým poloměrem.
11. Přepis skriptu do Pythonu
Dalším úkolem bude přepis prvního demonstračního příkladu z programovacího jazyka Scheme do Pythonu. Ve skutečnosti se nebude jednat o nic těžkého, protože se budou používat postupy, které již známe z předchozích částí tohoto seriálu a nově volané funkce budou mít prakticky stejný způsob volání, jaký jsme použili ve Scheme. Nejdříve přepíšeme deklaraci dialogu (formuláře) zobrazeného uživateli:
register(
"new_image_with_circle",
"Vytvor novy obrazek s kruznici.",
"Vytvor novy obrazek s kruznici.",
"Pavel Tisnovsky",
"Open source",
"2017-05-04",
"Vytvor novy obrazek s kruznici",
"", # plugin se spusti jen pokud neexistuje obrazek
[ # parametry
(PF_SPINNER, "width", "Image width", 256, (16, 8192, 16)),
(PF_SPINNER, "height", "Image height", 256, (16, 8192, 16)),
(PF_SPINNER, "radius", "Radius", 50, (10, 200, 10)),
(PF_COLOR, "color", "Barva", (1.0, 1.0, 0.0)),
(PF_COLOR, "background", "Pozadi", (0.0, 0.0, 0.0))
],
[],
new_image_with_circle,
menu="<Image>/Filters/Test/")
Následně pozměníme sekvenci příkazů pro vytvoření nového obrázku se zadanými rozměry, přidání hladiny do tohoto obrázku a následně vyplnění hladiny vybranou (konstantní) barvou. Tento postup již také známe z předchozích částí seriálu:
# vytvoreni noveho obrazku
image = gimp.Image(int(width), int(height), RGB);
# vytvoreni nove hladiny
layer = gimp.Layer(image, "Circle", int(width), int(height), RGB_IMAGE, 100, NORMAL_MODE)
# nastaveni barvy vykreslovani pozadi (druha barva ve vyberu)
gimp.set_background(background_color)
# vyplneni hladiny konstantni barvou
layer.fill(BACKGROUND_FILL)
# pridani hladiny do zasobniku hladin v obrazku
image.add_layer(layer, 0)
Nové je ovšem volání funkce určené pro vytvoření výběru. To vypadalo ve Scheme takto:
; vytvoření výběru ve tvaru kružnice
(gimp-image-select-ellipse
image ; obrázek v němž se výběr vytvoří
CHANNEL-OP-REPLACE ; přepsání oblasti původního výběru
(- (/ image-width 2) radius) ; levý horní roh výběru
(- (/ image-height 2) radius)
(* 2 radius) (* 2 radius)) ; rozměry výběru
Přepis do Pythonu je následující:
# vytvoreni vyberu ve tvaru kruznice
pdb.gimp_image_select_ellipse(image,
CHANNEL_OP_REPLACE, # obrazek v nemz se vyber vytvori
width/2 - radius, # prepsani oblasti puvodniho vyberu
height/2 - radius, # levy horni roh vyberu
2*radius, 2*radius) # rozmery vyberu
Poslední operací je vyplnění výběru barvou zvolenou uživatelem:
# nastaveni barvy vykreslovani pozadi (prvni barva ve vyberu)
gimp.set_background(selected_color)
# vykresleni obrazce - jeho vypln
pdb.gimp_edit_fill(layer, BACKGROUND_FILL)
Obrázek 16: Dialog příkladu přepsaného do Pythonu.
12. Úplný zdrojový kód třetího demonstračního příkladu
Úplný zdrojový kód dnešního třetího a současně i posledního demonstračního příkladu vypadá následovně:
#!/usr/bin/env python
from gimpfu import *
# funkce zavolana po spusteni pluginu uzivatelem
def new_image_with_circle(width, height, radius, selected_color, background_color):
# vytvoreni noveho obrazku
image = gimp.Image(int(width), int(height), RGB);
# vytvoreni nove hladiny
layer = gimp.Layer(image, "Circle", int(width), int(height), RGB_IMAGE, 100, NORMAL_MODE)
# nastaveni barvy vykreslovani pozadi (druha barva ve vyberu)
gimp.set_background(background_color)
# vyplneni hladiny konstantni barvou
layer.fill(BACKGROUND_FILL)
# pridani hladiny do zasobniku hladin v obrazku
image.add_layer(layer, 0)
# vytvoreni vyberu ve tvaru kruznice
pdb.gimp_image_select_ellipse(image,
CHANNEL_OP_REPLACE, # obrazek v nemz se vyber vytvori
width/2 - radius, # prepsani oblasti puvodniho vyberu
height/2 - radius, # levy horni roh vyberu
2*radius, 2*radius) # rozmery vyberu
# nastaveni barvy vykreslovani pozadi (prvni barva ve vyberu)
gimp.set_background(selected_color)
# vykresleni obrazce - jeho vypln
pdb.gimp_edit_fill(layer, BACKGROUND_FILL)
# zobrazeni
gimp.Display(image)
# zajisteni, ze se okno s obrazkem skutecne prekresli
gimp.displays_flush()
# Registrace skriptu do prostredi grafickeho editoru GIMP
# a specifikace parametru nastavitelnych uzivatelem,
# ktere se posleze prenesou jako parametry skriptu.
register(
"new_image_with_circle",
"Vytvor novy obrazek s kruznici.",
"Vytvor novy obrazek s kruznici.",
"Pavel Tisnovsky",
"Open source",
"2017-05-04",
"Vytvor novy obrazek s kruznici",
"", # plugin se spusti jen pokud neexistuje obrazek
[ # parametry
(PF_SPINNER, "width", "Image width", 256, (16, 8192, 16)),
(PF_SPINNER, "height", "Image height", 256, (16, 8192, 16)),
(PF_SPINNER, "radius", "Radius", 50, (10, 200, 10)),
(PF_COLOR, "color", "Barva", (1.0, 1.0, 0.0)),
(PF_COLOR, "background", "Pozadi", (0.0, 0.0, 0.0))
],
[],
new_image_with_circle,
menu="<Image>/Filters/Test/")
main()
Obrázek 17: Výsledek běhu příkladu přepsaného do Pythonu.
13. Repositář s demonstračními příklady
Všechny tři dnes popsané demonstrační příklady byly uloženy do Git repositáře dostupného na adrese https://github.com/tisnik/presentations. Příklady si můžete v případě potřeby stáhnout i jednotlivě bez nutnosti klonovat celý repositář (každý příklad je tvořen jediným skriptem):
Příklad | Odkaz |
---|---|
selection1.scm | https://github.com/tisnik/presentations/blob/master/gimp/scheme/selection1.scm |
selection2.scm | https://github.com/tisnik/presentations/blob/master/gimp/scheme/selection2.scm |
selection1.py | https://github.com/tisnik/presentations/blob/master/gimp/GIMP-Python/selection1.py |
14. Odkazy na Internetu
- GIMP Home Page
http://www.gimp.org/ - GIMP Python Documentation
https://www.gimp.org/docs/python/ - GIMP Selection Tools
https://docs.gimp.org/en/gimp-tools-selection.html - How to Make Selections in GIMP
https://www.thoughtco.com/how-to-make-selections-in-gimp-1701663 - Writing GIMP Scripts and Plug-Ins
http://gimpbook.com/scripting/ - GIMP Scripts and Plug-ins (slajdy)
http://gimpbook.com/scripting/slides/index.html - Use Python to write plug-ins for GIMP
http://www.ibm.com/developerworks/library/os-autogimp/index.html - 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 - Scheme control structures
http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-6.html#node_chap_5 - GIMP Python Documentation
https://www.gimp.org/docs/python/pygimp.html - Digital Watercolor with Mypaint 0.9 and Gimp-painter (video)
https://vimeo.com/18157214 - Water in Nature - a MyPaint + GIMP tutorial
http://www.gimptalk.com/index.php?showtopic=37706 - MyPaint (Wikipedia)
https://en.wikipedia.org/wiki/MyPaint - David Revoy (mj. používá MyPaint, GIMP i Kritu)
http://davidrevoy.com/ - Tux Paint Home Page
http://www.tuxpaint.org/ - Tux Paint (Wikipedia)
https://en.wikipedia.org/wiki/Tux_Paint - MyPaint Home Page
http://mypaint.org/ - MyPaint – Documentation
https://github.com/mypaint/mypaint/wiki/Documentation - Gamut
https://cs.wikipedia.org/wiki/Gamut - MtPaint Home Page
http://mtpaint.sourceforge.net/ - The mtPaint Handbook
http://mtpaint.sourceforge.net/handbook/en_GB/chap_00.html - MtPaint na Free Software Directory
https://directory.fsf.org/wiki/MtPaint - XPaint (minimalisticky pojatá home page)
http://sf-xpaint.sourceforge.net/ - XPaint (Wikipedia)
https://en.wikipedia.org/wiki/XPaint - X Athena Widgets
https://en.wikipedia.org/wiki/X_Athena_Widgets - Pinta: Painting Made Simple
https://pinta-project.com/pintaproject/pinta/ - Pinta (software)
https://en.wikipedia.org/wiki/Pinta_%28software%29 - Krita Home Page
https://krita.org/en/ - Krita (Wikipedia)
https://en.wikipedia.org/wiki/Krita - Pinta – Image Editing Alternative to The GIMP
https://www.maketecheasier.com/pinta-image-editing-alternative-to-the-gimp/ - GNU Paint Homepage
https://www.gnu.org/software/gpaint/ - GNU Paint na FreeCode
http://freecode.com/projects/gpaint/ - KolourPaint - Paint Program
https://www.kde.org/applications/graphics/kolourpaint/ - The KolourPaint Handbook
https://docs.kde.org/stable5/en/kdegraphics/kolourpaint/index.html - KolourPaint (Wikipedia)
https://en.wikipedia.org/wiki/KolourPaint - KIconEdit - Icon Editor
https://www.kde.org/applications/graphics/kiconedit/ - Phatch (Wikipedia)
https://en.wikipedia.org/wiki/Phatch - GrafX2 Home Page
http://pulkomandy.tk/projects/GrafX2 - GrafX2 (Wikipedia)
https://en.wikipedia.org/wiki/GrafX2 - Resurgence of Pixel art
http://www.developmentguruji.com/blog/142/Resurgence-of-Pixel-Art.html - Citypixel
http://www.citypixel.com/index.htm