Úloha 121: Obrázek obsahující všech 16M barev

Úkolem je vygenerovat nějaký zajímavý obrázek obsahující všechny 24-bitové barvy! (musí tedy mít minimálně 16M pixelů). Můžete obrázek generovat implicitně (podle zadaných parametrů) nebo můžete použít jako předlohu jiný rastrový obrázek. Musíte však v každém případě zajistit, že na výstupu bude všech 224 různých RGB barev!

Example

Základ

Budete pracovat v prostředí projektu 117raster z repository grcis (GIT). Je připravena aplikace, jejíž popis je na této stránce.

Svoji novou třídu/třídy (příp. i formulář) umístíte do zvláštního adresáře a řešení na konci odevzdáte tak, že zazipujete tento adresář a pošlete mailem jako přílohu. Nezasahujte prosím do zdrojových souborů projektu 117raster.

Pro všechny Vaše nové třídy použijte prosím "namespace" obsahující Vaše jméno, např. namespace JanVoprsalek;.

Pokud byste narazili na nějakou překážku (a měli nutkání základ projektu upravovat), radši nás okamžitě kontaktujte a opravíme to společně, aby z toho měli užitek i ostatní.

Pilotní verze

Jednoduchý algoritmus pro generování 16M-barevného obrázku je implementován jako modul (viz interface IRasterModule) a umístěn v souboru modules/FullColor/ModuleFullColor.cs.

Pilotní modul umí pracovat se vstupním obrázkem i bez něj (i Vy to máte volitelné, řešení s rozumným uplatněním vstupního obrázku je obtížnější – a proto za něj dostanete více bodů). V textovém parametru ("Param") je možné definovat rozměry výstupního obrázku (aby splňoval zadání, musí mít minimálně 16Mpix!), přepínat mezi "pomalým" a "rychlým" výpočtem, násilně ignorovat vstupní obrázek (i když Vám ho framework poskytne), ...

Doporučujeme, abyste ve Vašem řešení vycházeli právě z class ModuleFullColor, například i proto, že na konci výpočtu (Update()) má zapojen kód kontrolující, kolik různých barev se ve výsledném obrázku vyskytuje. Výsledky s chybějícími barvami nebudeme akceptovat jako nesplňující zadání úlohy.

Podrobnosti

Při jednodušší variantě řešení – bez vstupního obrázku – bude proměnnou veličinou pouze rozměr výsledku (opět připomínáme, že pixelů musí být minimálně 16M). Pokud budete implementovat různé varianty (např. různé algoritmy/ornamenty, apod.), zaveďte si své vlastní parametry do "Param". Oceníme, když budete umět generovat 16M-barevné obrázky různých velikostí.

Mnohem zajímavější úlohou je snažit se výsledným obrázkem aproximovat vstupní rastrový obraz. Vstup může být barevný nebo černobílý, velkého nebo malého rozlišení, v každém případě musíte na výstupu spočítat výsledek s 16M barvami! Můžete se soustředit na aproximaci vstupu (tj. snažit se, aby výstup "vypadal podobně" jako vstup) nebo ze vstupu využijete jenom nějakou část či složku – jen jeden barevný kanál, jen nějaký detail (výřez), apod.
V každém případě otestujte Váš algoritmus na různých vstupech a při různých nastaveních "Param".

Analýza parametrů z textového pole "Param" – s výhodou můžete použít funkce z pomocné knihovny Util: funkce Util.ParseKeyValueList(param); nejprve rozdělí text na úseky oddělené čárkami a v nich se poté mohou hledat definice ve tvaru <key>=<value>. Funkce bool Util.TryParse(p, "name", ref val) vrací true pokud byl daný klíč nalezen a současně je přepsána hodnota parametru val.

Paralelismus

Ve frameworku 117raster byla provedena změna – implicitně se volá funkce modulu IRasterModule.UpdateAsync() – aby se výpočet prováděl ve vedlejším vlákně a neblokoval hlavní formulář aplikace. Dále je uživateli umožněno pozastavit dlouho trvající výpočet tlačítkem "Break".

Vy jako programátoři se nemusíte touto změnou příliš trápit, je možné implementovat (jako dosud) jen synchronní (blokující) funkci Update(). Váš předek class DefaultRasterModule totiž obsahuje rozumnou implementaci asynchronní funkce UpdateAsync() volající virtuální Update() v jiném vlákně. Kdybyste narazili na jakékoli potíže s paralelismem (obzvlášť nás zajímá, jak to bude fungovat v Linuxu pod Mono), ozvěte se nám co nejdříve.
Zájemci si mohou implementace paralelismu prohlédnout (viz 117raster/FormMain.cs) a pokud najdete náměty na vylepšení, rádi si je přečteme nebo prodiskutujeme na cvičeních

Co odevzdat

Svoji novou třídu – modul (potomka DefaultRasterModule) a příp. další třídy nebo formuláře, které jste implementovali, umisťujte do zvláštního adresáře a řešení na konci odevzdejte tak, že zazipujete celý tento adresář a archiv pošlete svému cvičícímu mailem jako přílohu. Nezasahujte prosím do zdrojových souborů projektu 117raster (my bychom takové změny stejně ignorovali).

Pro všechny Vaše nové třídy použijte prosím "namespace" obsahující Vaše jméno, např. namespace JanVoprsalek;.

Ještě jinak řečeno: Vámi odevzdané řešení musí být kompatibilní s projektem 117raster tak, že až se do 117raster.csproj přidají Vaše soubory (váš adresář), bude v systému viditelný a použitelný Váš nový modul (Vaše nové moduly).

Termín

Odevzdat do: 24. 11. 2019

Body

Základ: 6 bodů za funkční algoritmus generující vždy 16M-barevný výstup!
bonus 4 body za použití vstupního obrázku (musí jít použít jakýkoli obrázek)
a další bonus až 5 bodů (invence, estetika, rychlost...).

Projekt

Visual Studio projekt: 117raster

Zdrojový soubor

Zazipovaný podadresář, který lze zapojit do projektu 117raster.


Copyright (C) 2015-2019 J.Pelikán, last change: 2019-11-04 13:51:40 +0100 (Mon, 04 Nov 2019)