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í

3. Rozmazání hranice výběrů

4. Výběr oblasti ve skriptu

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

11. Přepis skriptu do Pythonu

12. Úplný zdrojový kód třetího demonstračního příkladu

13. Repositář s demonstračními příklady

14. Odkazy na Internetu

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ů:

  1. Specifikace obrázku
  2. Specifikace prováděné operace: vytvoření nového výběru, přidání tvaru k existujícímu výběru atd.
  3. Levý horní roh (odpovídá vytvoření výběru pomocí myši)
  4. 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

  1. GIMP Home Page
    http://www.gimp.org/
  2. GIMP Python Documentation
    https://www.gimp.org/docs/python/
  3. GIMP Selection Tools
    https://docs.gimp.org/en/gimp-tools-selection.html
  4. How to Make Selections in GIMP
    https://www.thoughtco.com/how-to-make-selections-in-gimp-1701663
  5. Writing GIMP Scripts and Plug-Ins
    http://gimpbook.com/scripting/
  6. GIMP Scripts and Plug-ins (slajdy)
    http://gimpbook.com/scripting/slides/index.html
  7. Use Python to write plug-ins for GIMP
    http://www.ibm.com/developerworks/library/os-autogimp/index.html
  8. A Script-Fu Tutorial
    http://www.linuxtopia.org/online_books/graphics_tools/gimp_user_manual/en/gimp-using-script-fu-tutorial.html
  9. A Script-Fu Tutorial
    http://docs.gimp.org/en/gimp-using-script-fu-tutorial.html
  10. Scheme control structures
    http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-6.html#node_chap_5
  11. GIMP Python Documentation
    https://www.gimp.org/docs/python/pygimp.html
  12. Digital Watercolor with Mypaint 0.9 and Gimp-painter (video)
    https://vimeo.com/18157214
  13. Water in Nature - a MyPaint + GIMP tutorial
    http://www.gimptalk.com/index.php?showtopic=37706
  14. MyPaint (Wikipedia)
    https://en.wikipedia.org/wiki/MyPaint
  15. David Revoy (mj. používá MyPaint, GIMP i Kritu)
    http://davidrevoy.com/
  16. Tux Paint Home Page
    http://www.tuxpaint.org/
  17. Tux Paint (Wikipedia)
    https://en.wikipedia.org/wiki/Tux_Paint
  18. MyPaint Home Page
    http://mypaint.org/
  19. MyPaint – Documentation
    https://github.com/mypaint/mypaint/wiki/Documentation
  20. Gamut
    https://cs.wikipedia.org/wiki/Gamut
  21. MtPaint Home Page
    http://mtpaint.sourceforge.net/
  22. The mtPaint Handbook
    http://mtpaint.sourceforge.net/handbook/en_GB/chap_00.html
  23. MtPaint na Free Software Directory
    https://directory.fsf.org/wiki/MtPaint
  24. XPaint (minimalisticky pojatá home page)
    http://sf-xpaint.sourceforge.net/
  25. XPaint (Wikipedia)
    https://en.wikipedia.org/wiki/XPaint
  26. X Athena Widgets
    https://en.wikipedia.org/wiki/X_Athena_Widgets
  27. Pinta: Painting Made Simple
    https://pinta-project.com/pintaproject/pinta/
  28. Pinta (software)
    https://en.wikipedia.org/wiki/Pinta_%28software%29
  29. Krita Home Page
    https://krita.org/en/
  30. Krita (Wikipedia)
    https://en.wikipedia.org/wiki/Krita
  31. Pinta – Image Editing Alternative to The GIMP
    https://www.maketecheasier.com/pinta-image-editing-alternative-to-the-gimp/
  32. GNU Paint Homepage
    https://www.gnu.org/software/gpaint/
  33. GNU Paint na FreeCode
    http://freecode.com/projects/gpaint/
  34. KolourPaint - Paint Program
    https://www.kde.org/applications/graphics/kolourpaint/
  35. The KolourPaint Handbook
    https://docs.kde.org/stable5/en/kdegraphics/kolourpaint/index.html
  36. KolourPaint (Wikipedia)
    https://en.wikipedia.org/wiki/KolourPaint
  37. KIconEdit - Icon Editor
    https://www.kde.org/applications/graphics/kiconedit/
  38. Phatch (Wikipedia)
    https://en.wikipedia.org/wiki/Phatch
  39. GrafX2 Home Page
    http://pulkomandy.tk/projects/GrafX2
  40. GrafX2 (Wikipedia)
    https://en.wikipedia.org/wiki/GrafX2
  41. Resurgence of Pixel art
    http://www.developmentguruji.com/blog/142/Resurgence-of-Pixel-Art.html
  42. Citypixel
    http://www.citypixel.com/index.htm