Mezi jednu z nejužitečnějších vlastností známého bitmapového grafického editoru GIMP patří možnost rozšiřovat jeho funkce s využitím pluginů (modulů), díky nimž je možné implementovat například nové filtry nebo pomocné utility pro tvorbu animací či poloautomatickou retuš snímků. Tyto pluginy lze vytvářet buď s využitím programovacího jazyka Scheme (technologie Script-Fu) nebo – což bude s velkou pravděpodobností pro mnoho čtenářů užitečnější – s využitím Pythonu (technologie Python-Fu).

Obsah

1. Tvorba pluginů pro grafický editor GIMP

2. Skriptovatelnost GIMPu: základ pro tvorbu pluginů

3. Použít programovací jazyk Scheme?

4. Či naopak Python?

5. Základní typy objektů v GIMPu

6. Interaktivní konzole dostupná z GIMPu

7. Prohlížeč API

8. Jednoduchý skript pro GIMP napsaný v Pythonu

9. Přidání hladiny do vytvořeného obrázku

10. Kreslení do obrázku na úrovni jednotlivých pixelů

11. Vykreslení barvové palety

12. Aktualizace vrstvy a zobrazení výsledku

13. Seznam dnes popsaných metod a funkcí

14. Odkazy na Internetu

1. Tvorba pluginů pro grafický editor GIMP

V článku o bitmapových grafických editorech pro Fedoru, který na tomto serveru vyšel minulý měsíc, jsme se samozřejmě nezapomněli zmínit o pokročilém rastrovém grafickém editoru GIMP. Jedná se o známou (vedle konkurenční Krity pravděpodobně i nejznámější) interaktivní aplikaci, kterou je možné použít pro tvorbu a úpravu rastrových obrázků s využitím velkého množství kreslicích, editačních a retušovacích nástrojů. K dispozici jsou například nástroje typu „tužka“, „štětec“, „razítko“ či „rozprašovač“. Nalezneme zde i nástroje vhodné spíše pro úpravy fotografií (rozmazání oblasti, zaostření oblasti, klonování, barevná korekce), tvorbu jednoduchých animací, klikacích map určených pro webové stránky (tato technologie se však již bohudík nepoužívá) apod.

Obrázek 1: Původní a současně i výchozí nastavení grafického uživatelského rozhraní GIMPu se samostatnými okny. Takto pojaté grafické uživatelské rozhraní nevyhovovalo všem uživatelům, ovšem dnes existuje i možnost přepnutí GUI.

Podobně, jako je tomu v mnohých dalších vyspělých grafických editorech, existuje i v aplikaci GIMP možnost práce s vrstvami (layers), kanály (channels), cestami (paths – s využitím cest lze provádět i některé jednoduché operace známé například z grafických editorů pracujících s vektorovými výkresy) a výběrovými oblastmi (selections), které lze taktéž použít pro kreslení složitějších geometrických obrazců (výběr lze v případě potřeby převést na cestu nebo ho přímo vykreslit zvoleným kreslicím nástrojem). Nesmíme zapomenout ani na to, že se jedná o multiplatformní program použitelný jak v Linuxu, tak i v Microsoft Windows a dokonce i na macOS (i když na této platformě je uživatelská základna GIMPu poměrně malá).

Obrázek 2: Přepnutí GIMPu do režimu zobrazení s jediným oknem obsahujícím jak upravovaný rastrový obrázek, tak i všechny nástroje.

2. Skriptovatelnost GIMPu: základ pro tvorbu pluginů

Ovšem jednou z nejzajímavějších a taktéž nejužitečnějších vlastností tohoto grafického editoru je jeho aplikační programové rozhraní (API) zpřístupňující programátorům prakticky veškerou funkcionalitu GIMPu a taktéž podpora pro skriptování, přičemž skripty mají přístup k API, nezávisle na tom, ve kterém programovacím jazyce byly vytvořeny. Původně se v GIMPu mohly psát skripty pouze v programovacím jazyce Scheme (pro tyto skripty, resp. pro celou technologii, se používá název Script-Fu), ovšem v současnosti existuje i podpora pro populární programovací jazyk Python, který mimochodem některé své vlastnosti převzal právě ze Scheme a LISPu (což je ideový předchůdce Scheme). V následujících kapitolách si řekneme, jakým způsobem mohou skripty napsané v programovacím jazyce Python vytvářet nové obrázky a provádět nad nimi základní grafické operace – kreslení na úrovni jednotlivých pixelů a taktéž kreslení s využitím již existujících kreslicích nástrojů, zejména tužky (pen), štětce (brush) či rozprašovače (airbrush).

Obrázek 3: Konzole aplikace GIMP, která je určená pro tvorbu, spouštění a ladění skriptů i pluginů.

Poznámka: ve skutečnosti je možné přes PDB (Procedural Database) ovládat GIMP i z dalších jazyků, například z Perlu.

3. Použít programovací jazyk Scheme?

Jak jsme se již dozvěděli v předchozí kapitole, je možné si při psaní pluginů pro GIMP vybrat ze dvou programovacích jazyků. Nejenom z historických důvodů je podporován programovací jazyk Scheme, a to i proto, že se jeho implementace nazvaná GNU Guile měla stát standardním jazykem pro projekty vznikající v rámci GNU, nicméně historie samotného Scheme je mnohem starší. Původními autory jsou Guy Lewis Steele a Gerald Jay Sussman (Steele and Sussman, někdy též zkracováno na S and S), kteří v době návrhu tohoto jazyka pracovali ve slavném Massachussetském technologickém institutu (MIT). První verze jazyka Scheme byla v průběhu roku 1975 naprogramována v samotném LISPu, konkrétně v MacLispu. Název tohoto dialektu programovacího jazyka LISP ovšem nemá nic společného s počítači firmy Apple, jednalo se o verzi LISPu vytvořenou taktéž na MIT, která byla původně určena pro počítače PDP-10 a operační systém Multics.

Obrázek 4: O programovacím jazyku Scheme vyšlo i několik více či méně úspěšných knížek. Zde je zobrazeno třetí vydání knihy nazvané The Scheme Programming Language.

Pro další vývoj programovacího jazyka Scheme byl důležitý rok 1978, kdy došlo ke vzniku jeho prvního standardu, jenž byl popsán v „Revidované zprávě o algoritmickém jazyku Scheme“ (Revised Report on the Algorithmic Language Scheme). Jazyk se samozřejmě dále vyvíjel, takže v roce 1985 vznikl další popis jeho standardu zveřejněný v dokumentu nazvaném „Revize revidované zprávy o Scheme, neboli neobvyklý LISP“. Tradice ve vydávání revizí (a revizí revizí) původní zprávy o programovacím jazyku Scheme zůstala zachována až do dnešní doby. Postupně vzniklo celkem sedm revizí, což mj. znamená, že většina současných implementací tohoto programovacího jazyka odpovídá buď šesté revizi („The Revised6 Report on the Algorithmic Language Scheme“) nebo se přizpůsobuje revizi sedmé („The Revised7 Report on the Algorithmic Language Scheme“), která byla schválena v roce 2013.

Obrázek 5: Čtvrté vydání známé knihy The Scheme Programming Language.

4. Či naopak Python?

Alternativním způsobem tvorby pluginů pro bitmapový grafický editor GIMP je použití programovacího jazyka Python. Tento jazyk vznikl již před 25 lety a v současnosti se většinou setkáme se dvěma jeho verzemi: stále ještě používaným Pythonem 2.7 a novějším Pythonem 3.6. Pro většinu uživatelů a vývojářů je použití tohoto známého a populárního programovacího jazyka nepochybně jednodušší a ve skutečnosti i praktičtější, protože se znalost Pythonu může velmi dobře uplatnit i v dalších oblastech informatiky, ať již se jedná o psaní jednodušších skriptů pro vlastní potřebu, tak i o tvorbu webových aplikací (serverová část) či aplikací určených pro desktop. Ostatně na stránkách tohoto serveru jsme se již zabývali jednou z možností uplatnění tohoto programovacího jazyka společně s multimediální knihovnou Pygame a krátce jsme se zmínili o i projektu pyglet, což je knihovna určená pro tvorbu her a dalších multimediálních aplikací založených taktéž na Pythonu a na grafické knihovně OpenGL (tímto projektem se budeme podrobněji zabývat v samostatně vznikajícím miniseriálu).

Obrázek 6: Jedna ze známých knih o programovacím jazyce Python: Dive into Python (verze 3).

Právě z důvodu větší popularity i lepšího praktického použití Pythonu (alespoň v současnosti) bude většina ukázek pluginů pro GIMP, s nimiž se seznámíme v navazujících kapitolách i v dalších dílech tohoto seriálu, vytvořena právě v tomto programovacím jazyku. U některých pluginů bude pro porovnání ukázána i jeho implementace v programovacím jazyku Scheme, takže si čtenáři budou moci sami udělat představu, jak se od sebe tyto dva jazyky odlišují a jaké vlastnosti mají naopak podobné (samotné volání API funkcí i implementovaný algoritmus budou totožné).

Obrázek 7: Další ze známých knih o programovacím jazyce Python: Think Python.

5. Základní typy objektů v GIMPu

Programátor může při tvorbě skriptů určených pro grafický editor GIMP používat širokou paletu objektů spravovaných samotným editorem. Mnohé z těchto objektů jsou dostupné i uživatelům z grafického uživatelského rozhraní editoru, kde je s nimi možné různým způsobem interaktivně manipulovat. Jedná se především o samotné obrázky, dále pak hladiny umisťované do obrázků (kreslení je prováděno do hladin), kanály, tužky, štětce, barvové palety, výběry atd. Skripty psané v programovacím jazyce Python a Scheme mohou buď při svém běhu vytvořit objekty nové, což například může vést ke skutečnému vytvoření nového obrázku, přidání hladiny do obrázku atd., nebo mohou pomocí rozličných dotazovacích funkcí získat některý z již existujících objektů. Například skript, který má vykreslit nějaký objekt do aktivního obrázku, musí získat identifikátor tohoto obrázku (vždy se jedná o celé číslo, protože API GIMPu je poměrně nízkoúrovňové), následně identifikátor hladiny a teprve poté je možné provést požadovanou činnost.

Obrázek 8: Spuštění interaktivní konzole (původní GUI GIMPu).

6. Interaktivní konzole dostupná z GIMPu

Pro základní seznámení s aplikačním programovým rozhraním grafického editoru GIMP je možné použít interaktivní konzoli jazyka Scheme či Python, z níž lze spouštět (přesněji řečeno vyhodnocovat) výrazy, definovat nové funkce, třídy a proměnné, volat funkce API atd. Každý výraz zapsaný do vstupního řádku interaktivní konzole je předán interpretru zvoleného skriptovacího jazyka, který výraz zpracuje a do textového pole umístěného nad vstupním řádkem vypíše jeho návratovou hodnotu (popř. chybové hlášení). V mnoha případech, zejména při kreslení do obrázku, je mnohem důležitější vedlejší efekt volané funkce či funkcí než jejich návratová hodnota. Interaktivní konzole jazyka Scheme se vyvolá příkazem Filters → ScriptFu → Console, konzole programovacího jazyka Python pak velmi podobným příkazem Filters → PythonFu → Console.

Obrázek 9: Dialog pro nastavení parametrů pro uživatelský plugin.

Konzole je skutečně interaktivní, protože je podporováno automatické doplňování názvů tříd či funkcí pomocí klávesy Tab – identifikátor je buď přímo doplněn nebo je nabídnut seznam všech identifikátorů začínajících stejným řetězcem. Například po zápisu „gimp.“ se stlačením klávesy Tab vypíšou všechny dostupné identifikátory, jichž je v současné verzi GIMPu několik set.

Obrázek 10: Popis funkcí, které je možné ze skriptů/pluginů volat.

Obrázek 11: Výsledek činnosti uživatelského pluginu.

7. Prohlížeč API

V interaktivní konzoli interpretru vybraného skriptovacího jazyka lze tlačítkem Procházet/Browse spustit velmi užitečný nástroj – prohlížeč procedur. V tomto nástroji je možné vyhledávat všechny procedury použitelné jak interaktivně (tj. přímo z okna konzole), tak i ze skriptů – jedná se jak o procedury nabízené samotným GIMPem, tak i procedury definované v externích souborech (skriptech), včetně skriptů uložených v domácím adresáři uživatelů (většinou se v případě Linuxu jedná o adresář ~/.gimp-verze/scripts). Procedury je možné vyhledávat podle jejich jména (nejenom prefixu, což je důležité, protože většina interních procedur začíná prefixem gimp- popř. gimp_, který není nutné při vyhledávání zapisovat), autora, typu atd. U nalezené procedury se zobrazí její popis, včetně seznamu a významu všech jejích parametrů. S využitím interaktivní konzole a prohlížeče procedur je možné psát skripty poměrně rychle, včetně možnosti jejich okamžitého testování.

Obrázek 12: Prozatím prázdná interaktivní konzole Pythonu po spuštění.

Obrázek 13: Nabídka funkcí a metod začínajících na „g“.

Obrázek 14: Nabídka funkcí a metod začínajících na „gimp.“.

Obrázek 15: Procházení API GIMPu.

8. Jednoduchý skript pro GIMP napsaný v Pythonu

Zkusme si nyní ukázat, jakým způsobem se používají některé základní funkce dostupné přes aplikační programové rozhraní rastrového grafického editoru GIMP. Ukážeme si vytvoření nového obrázku a přidání jedné hladiny (layer) do tohoto obrázku. Tuto druhou operaci je nutné provést, protože do obrázku bez hladiny není možné provádět žádné vykreslování. Pro vytvoření nového obrázku se používá metoda nazvaná gimp_image_new objektu pdb jejímiž parametry jsou rozměry obrázku a jeho typ, tj. symbol určující, zda se jedná o obrázek v barvovém prostoru RGB, obrázek ve stupních šedi (GRAYSCALE) atd. Obrázek ležící v barvovém prostoru RGB (což je pro GIMP výchozí nastavení), jehož rozměry mají být 320×240 pixelů, se vytvoří následujícím příkazem:

pdb.gimp_image_new(320, 240, RGB)

Popř. si můžeme výsledek volání této metody uložit do proměnné, kterou použijeme později:

image = pdb.gimp_image_new(320, 240, RGB)

Vytvořený obrázek je prozatím neviditelný (GIMP pro něj totiž ani neotevřel nové okno), ovšem to se dá velmi jednoduše napravit zavoláním metody pdb.gimp_display_new(), jíž se přes parametr předá objekt reprezentující obrázek. Ten jsme si uložili do proměnné nazvané image, takže zobrazení provedeme následovně:

pdb.gimp_display_new(image)

Po zadání tohoto příkazu by se mělo objevit nové okno s obrázkem a taktéž s varováním, že se do obrázku prozatím nedá kreslit:

Obrázek 16: Nově vytvořený obrázek, ovšem prozatím bez hladiny (nelze do něj kreslit, což je zmíněno ve stavovém řádku).

9. Přidání hladiny do vytvořeného obrázku

Obrázek již máme vytvořený, zbývá nám však ještě provést minimálně jeden důležitý úkol – vytvořit novou hladinu a přidat tuto hladinu do našeho obrázku. Nová hladina se zkonstruuje pomocí metody pdb.gimp_layer_new() a přidání hladiny do obrázku zajistí metoda pdb.gimp_image_add_layer(). Při tvorbě hladiny je zapotřebí specifikovat obrázek, pro nějž je hladina vytvářena, její rozměry (mohou se totiž lišit od rozměrů obrázku, ve kterém hladina leží), typ hladiny (RGB, RGB s alfa kanálem atd.), jméno hladiny (to uvidí uživatel v dialogu určeném pro práci s hladinami), její průhlednost a taktéž režim, který udává, jakým způsobem jsou hodnoty jednotlivých pixelů zkombinovány s hodnotami pixelů v níže ležících hladinách. Nejprve tedy vytvoříme novou hladinu pojmenovanou „vrstva“ se stejnými rozměry, jaké má obrázek, tedy 320×240 pixelů. Hladina bude neprůhledná (100% neprůhlednost), režim překreslení normální (zde to nehraje velkou roli, protože se jedná o první hladinu v obrázku, pod níž již nic neleží):

layer1 = pdb.gimp_layer_new(image, 320, 240, RGB_IMAGE, "vrstva", 50, NORMAL_MODE)

Následně je nutné hladinu pomocí metody pdb.gimp_image_add_layer() vložit na zásobník hladin. Pro každý obrázek existuje zásobník s jednotlivými hladinami, do něhož je možné přidávat další hladiny, měnit jejich pořadí atd. Pokud se jako index hladiny předá konstanta -1, bude nová hladina ležet nad všemi ostatními hladinami. V našem případě použijeme index 0, protože se bude jednat o jedinou hladinu v obrázku:

pdb.gimp_image_add_layer(image, layer1, 0)

Nyní by měl být obrázek připraven na další pokusy:

Obrázek 17: Nová vrstva byla přidána do obrázku a stala se současně aktivní vrstvou (viz text označený šipkou).

10. Kreslení do obrázku na úrovni jednotlivých pixelů

Další důležitou funkcí dostupnou přes aplikační programové rozhraní grafického editoru GIMP, se kterou se v dnešním článku seznámíme, je funkce nazvaná gimp_drawable_set_pixel(). Tato funkce je určena pro změnu barvy pixelu objektů, které se souhrnně nazývají drawable („pokreslitelné“). Jedná se o masky, kanály a vrstvy – do všech tří typů objektů je možné kreslit na té nejnižší úrovni tím způsobem, že se mění barvy jednotlivých pixelů. Funkce gimp_drawable_set_pixel() vyžaduje při svém volání předání pěti parametrů – objektu, jehož pixel se má změnit (v našem případě se bude jednat o hladinu, x-ovou a y-ovou souřadnici pixelu, počet měněných kanálů (v případě barvového prostoru RGB se jedná vždy o tři kanály) a jako poslední parametr se předává n-tice obsahující trojici bajtů (opět v případě barvového prostoru RGB), kde každý bajt odpovídá jedné barvové složce modelu RGB.

Vykreslení prostředního pixelu v obrázku bílou barvou se tedy provede takto:

pdb.gimp_drawable_set_pixel(vrstva1, 160, 120, 3, (255, 255, 255))

Obrázek 18: Jediný vykreslený pixel v obrázku je zde zvýrazněn červeným čtvercem.

11. Vykreslení barvové palety

Zkusme nepatrně složitější příklad. Bude se jednat o vykreslení barvové palety, resp. přesněji řečeno pixelů, u nichž se v jedné ose mění červená barvová složka a v ose druhé pak složka modrá (zelená barvová složka zůstává konstantní). Skript je velmi jednoduchý, pouze při jeho zadávání do interaktivní konzole nesmíme zapomenout na odsazení bloků uvnitř programových smyček:

for y in range(0,240):
    for x in range(0,255):
        pdb.gimp_drawable_set_pixel(layer1, x, y, 3, (x, 127, y))

Poznámka: jedná se o velmi pomalou metodu modifikace obrázku, takže obě vnořené smyčky budou dokončeny během jednotek sekund (je nutné počkat).

12. Aktualizace vrstvy a zobrazení výsledku

Aby se změny skutečně viditelně projevily v obrázku, je nutné provést ještě jednu operaci – GIMPu je zapotřebí říci, že má celou vrstvu (která je drawable) aktualizovat, a to pomocí metody nazvané gimp_drawable_update(). Této metodě se předá objekt, jehož pixely je nutné aktualizovat, a následně obdélník, jehož plocha se bude aktualizovat. Pro jednoduchost budeme předpokládat, že se má aktualizovat celá vrstva s rozměry 320×240 pixelů (v rámci optimalizací se však mohou ve skutečných pluginech specifikovat jen skutečně změněné oblasti):

pdb.gimp_drawable_update(layer1, 0, 0, 320, 240)

Obrázek 19: Obrázek s barvovou paletou po aktualizaci vrstvy.

13. Seznam dnes popsaných metod a funkcí

Na závěr si shrňme, s jakými metodami API GIMPu jsme se prozatím setkali. V Pythonu se všechny metody volají stylem pdb.jméno_metody(parametry):

Metoda Stručný popis metody
gimp_image_new vytvoření nového obrázku (jen interně, nezobrazí se žádné okno)
gimp_display_new zobrazení okna s obrázkem i příslušným menu a pravítkem
gimp_layer_new vytvoření nové vrstvy
gimp_image_add_layer přidání vrstvy do obrázku
gimp_drawable_set_pixel vykreslení pixelu do libovolného objektu typu „drawable“
gimp_drawable_update aktualizace plochy (=překreslení) libovolného objektu typu „drawable“

Příště si ukážeme tvorbu skutečných pluginů s vlastním dialogem pro nastavení jejich vlastností atd.

14. Odkazy na Internetu

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