Prostředí 117raster pro rastrové obrázky

Projekt 117raster slouží jako prostředí pro experimenty s rastrovými obrázky. Projekt můžete obohacovat svými vlastními moduly, které se potom dají spouštět v běžící WinForms aplikaci.

117raster app

Projekt

Základem poslouží projekt 117raster z repository grcis (GIT). Je připravena aplikace, která umí načítat a ukládat rastrové obrázky a spouštět na nich moduly implementované s pomocí interface IRasterModule.

Základ projektu je v adresáři 117raster, odkazuje se i na některé pomocné třídy z adresáře common. Některé z modulů jsou v adresáři modules.

Projekt obsahuje na ukázku modul ModuleGlobalHistogram, který je uložený v podadresáři ModuleHistogram a celý je vložen do VS projektu. Tento modul umí počítat histogramy obrázku a kreslit je buď souhrnně (šedé odstíny "gray") nebo po jednotlivých barevných složkách ("red", "green" nebo "blue")

Další ukázkový module je ModuleFormula, který je uložen v podadresáři modules/ModuleFormula a je též vložen do našeho VS projektu. Tento modul umí za běhu načítat C# skripty z textových souborů a v nich uložené funkce používat k vytváření nových nebo transformaci existujících obrázků.

Modul nemá žádné vlastní GUI a potřebný kód načítá ze zadaného textového souboru (default = Contrast.cs). Soubor scriptu můžete za běhu měnit a není potřeba aplikaci restarovat! Významné funkce ("lambdy"), které můžete ve scriptu definovat, jsou:

  • formula.contextCreate = (in string param) => Dictionary<string, object> – nepovinná funkce, když ji definujete, můžete parsovat textové parametry z textového pole Param: a hodnoty, které mají pro Vaše filtry význam, dáte do výstupní mapy, ze které si je budou moci pixelové funkce snadněji přečíst. Tím lze ovlivňovat běh filtrů, jak je ukázáno např. ve skriptu Swap.cs. Pozn: do výstupní mapy můžete dávat libovolné hodnoty, které budou předpočítané a následně jednotlivým pixelovým funkcím sdílené. Tj. je možné chápat krok contextCreate jako globální "preprocessing" s hodnotami ukládanými do mapy Dictionary<string, object>.
  • formula.pixelCreate = (in ImageContext ic, out float R, out float G, out float B) – nepovinná funkce, když ji definujete, bude Váš modul schopen vytvářet nové obrázky. Barvu jednotlivých pixelů určí právě tato funkce, souřadnice pixelu i celkový rozměr obrázku najde v ImageContext. Rozsahy všech barevných hodnot jsou 0.0 až 1.0!
  • formula.pixelTransform0 = (in ImageContext ic, ref float R, ref float G, ref float B) – nepovinná funkce, když ji definujete, bude Váš modul umět transformovat vstupní obrázek na výstupní obrázek. Rozměry obou obrázků jsou shodné a navíc se jedná o tzv. bezkontextovou transformaci, tedy barva každého výstupního pixelu záleží jenom na barvě odpovídajícího vstupního pixelu (a případných globálních parametrech). Souřadnice pixelu i celkový rozměr obrázku je v ImageContext. Rozsahy všech barevných hodnot jsou 0.0 až 1.0! Tato funkce nemá povinnost barvu pixelu změnit, můžete nechat některé z hodnot R,G,B nezměněny. Návratová hodnota true znamená, že byla barva pixelu změněna, false umožňuje použít rychlejší postup, pokud se daný pixel nezměnil.

Ovládání

Po kompilaci a spouštění projektu 117raster se objeví formulář, do kterého lze načítat rastrové obrázky buď tlačítkem Load image nebo myší systémem "Drag & Drop". Po načtení obrázku do paměti si ho můžeme v aplikaci prohlížet (ke škálování resp. posunování slouží kolečko resp pravé tlačítko myši).

Vlevo dole se v list-boxu ukazují všechny "moduly" (třídy implementující interface IRasterModule), které byly při kompilaci nalezeny. Modul zapneme (aktivujeme) jeho výběrem a tlačítkem Activate module. Pokud má modul nějaké GUI okno, to se v takovém případě zobrazí a uživatel pak může opakovaně provádět výpočet nad načteným vstupním obrázkem. K opakovanému spuštění výpočtu dojde:

  • po stisku tlačítka "Recompute", je-li definován vstupní obrázek
  • po změně textových parametrů "Param:" a jejich odeslání klávesou "Enter"
  • po stisku levého tlačítka myši spolu s klávesou Ctrl na vstupním obrázku, má-li modul nastavenou vlastnost HasPixelUpdate a implementovanou metodu PixelUpdate().

Po spočtení výsledného obrázku se výsledek zobrazí ve formuláři (check-box "result" slouží k přepínání vstupu a výstupu). Jestliže je třeba na spočítaný obrázek navázat – použít ho jako vstup pro nový výpočet – použije se tlačítko "Result -> input".

Interface IRasterModule

Obecné API pro moduly, které pracují s rastrovými obrázky. Každý modul může mít žádný až několik vstupních obrázků (Bitmap nebo FloatImage), žádný až několik výstupních obrázků (Bitmap nebo FloatImage) a volitelné GUI okno (formulář), ze kterého se dají zadávat dodatečné informace a/nebo v něm ukazovat přímo spočítané výsledky.
Pokud je výsledkem výpočtu modulu zase rastrový obraz, ten se zobrazí přímo v původním formuláři aplikace 117raster (k přepínání vstupu a výstupu slouží check-box "result")

Přehled nejdůležitějších položek interface IRasterModule

  • string Author – celé jméno (preferujeme "PříjmeníJméno") autora modulu
  • string Name – jméno modulu
  • string Tooltip – obláčková nápověda k textovým parametrům "Param"
  • string Param – aktuální hodnota textového parametru (je zcela na autorovi/autorce, co bude z textového parametru číst; parametr zadává uživatel[ka] ve formuláři na řádce Param:)
  • int InputSlots – počet vstupních rastrových obrázků (typicky 1 až M)
  • void SetInput(Bitmap inputImage, int slot) – nastavení vstupního obrázku do daného slotu
  • void Update() – provedení výpočtu v modulu (synchronní metoda)
  • bool HasPixelUpdate – má se volat PixelUpdate() po interakci uživatele na vstupu (standardně je to Ctrl + levé tlačítko myši)?
  • void PixelUpdate(int x, int y) – provedení lokálního výpočtu (handler interakce) v modulu (synchronní metoda). Bude se vyvolávat pomocí Ctrl + levé tlačítko myši na zdrojovém obrázku.
  • int outputSlots – počet výstupních rastrových obrázků (typicky 0 až N)
  • Bitmap GetOutput(int slot) – přečtení výstupního obrázku (po dokončení výpočtu)
  • bool GuiWindow – aktivace/deaktivace GUI okna modulu

Třída DefaultRasterModule

Implementuje skoro všechny položky interface IRasterModule, pro pohodlnost i snazší kompatibilitu do budoucna se doporučuje odvozovat všechny Vaše budoucí moduly právě od této třídy!

Ovládání prohlížeče obrázků

Pravé tlačítko myši – posunování obrázku.
Kolečko myši – zmenšení/zvětšení (s klávesou Shift rychleji).
"Page Up", "Page Down", "+", "-" – zmenšení/zvětšení (s klávesou Shift rychleji).
Tlačítko "Zoom 100%" – reset zobrazení = 100% zvětšení, umístění obrázku do levého horního rohu.

Přidávání dalších modulů (nebudete potřebovat v prvních úlohách šk. roku 2020/2021)

Stačí do projektu 117raster připojit novou třídu implementující interface IRasterModule (nebo ještě lépe potomka class DefaultRasterModule). Aplikace sama třídu rozpozná a přidá do list-boxu "Module".

Nové studentské moduly (řešení úloh) vytvářejte prosím ve speciálně pojmenovaných namespace, např. použijte Vaše jméno a příjmení bez diakritiky, zredukují se tím případné konflikty při překladů více modulů najednou. Příklad – místo

namespace Modules;
použijte
namespace JanVoprsalek;

HDR obrázky

Zatím ne.


Copyright (C) 2019-2020 J.Pelikán, last change: 2020-10-26 01:19:08 +0100 (Mon, 26 Oct 2020)