úloha 084: Umělecký filtr - tahy štětcem

Úkolem je navrhnout a implementovat algoritmus, který počítá efekt nad rastrovým obrázkem. Výsledek by se měl podobat některé z impresionistických malířských technik, např. viz Wiki stránka o impresionismu.

Renoir

Základ

Základem poslouží projekt 084filter z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a ihned se automaticky spouští metoda Filter.Recompute() přepočítávající vstup do nové podoby. Výstup je poté zobrazen ve formuláři. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je ve zdrojáku Filter.cs označen závorkami:

  // !!!{{
  // !!!}}

Technicky

Funkce Filter.Recompute() má tyto parametry:
  • Bitmap input vstupní obrázek (pokud by náhodou byl null, musí se s tím funkce vypořádat - smí též vrátit null)
  • string param - volitelný parametr ve formě řetězce, pokud ho použijete, budete muset sami zadefinovat co a v jakém formátu má smí obsahovat (pilotní implementace obsahuje zadání velikosti obdélníkové buňky - jedno nebo dvě celá čísla oddělená čárkou)
Návratovou hodnotou funkce je přepočítaný obrázek ve formátu Bitmap, smí být null.

Pokud nechcete používat rychlou (ale nebezpečnější a méně přehlednou) variantu přístupu k datům obrázků, nemusíte, prostě použijte kód založený na druhé větvi #if.

Programátorské detaily

Pilotní implementace demonstruje několik technických aspektů:
  1. vytvoření instance výstupního rastrového obrázku s pevným formátem Format24bppRgb
  2. rychlý přístup k binárním datům pixelů - pomocí metody Bitmap.LockBits() a unsafe bloku s použitím ukazatelů do uzamčeného paměťovém bloku (pomalá alternativa /s jiným algoritmem/ je také k dispozici)
  3. výpočet v samostatném vlákně - s vhodnou frekvencí je nutné v cyklech kontrolovat hodnotu globální logické proměnné Form1.cont (při hodnotě false by měl algoritmus co nejdříve předčasně skončit)
  4. Drag & Drop vstupního obrázku - vstupní soubor můžete do formuláře přenést myší z jakékoli aplikace Windows podporující D&D.

Podpora

Pokud byste potřebovali, funkce pro převody mezi RGB a HSV najdete v souboru common/MathSupport.cs. Funkci na převod do odstínů šedé najdete v common/RasterDrawing.cs

Co odevzdat

Musíte poslat zdrojový soubor Filter.cs.
Na první řádce v komentáři napište své jméno.
Do procedury InitParams() můžete napsat sadu vhodných vstupních parametrů. V parametru 'name' vraťte své jméno.
Pokud použijete stringový parametr param, nezapomeňte popsat jeho formát a sémantiku.
Pokud jste dosáhli nějakého pěkného výsledku s konkrétním vstupním obrázkem, můžete poslat i ten vstup. Ale pozor na velikost přílohy, radši ho někam vystavte (Dropbox, GoogleDrive, uloz.to) a pošlete jen URL.

Do odevzdaného zdrojáku připište podrobnější komentář o původu vašeho algoritmu: zda jste ho sami vymysleli, zda jste se inspirovali literaturou, nějakým efektem (PhotoShop, GiMP, ..), apod. Na jaká data se má filtr aplikovat, jaký má být výsledek výpočtu..

Termín

Odevzdat do: 10. 12. 2017

Body

Základ: 8 bodů, bonus až 6 bodů.

Projekt

Visual Studio projekt: 084filter.

Zdrojový soubor

Modifikujte a odevzdejte soubor: Filter.cs
Do funkce InitParams() napište své jméno!

Data

Váš algoritmus by měl fungovat na libovolný vstupní obrázek, pro testování můžete použít pár obrázků přímo z repository, z adresáře data, dále můžete použít třeba obrázky sail.png, silverstone-17671.png, maran-18587.png, monarch.png, skyline129-178-246.png.

Výsledky

Stránka obsahující vybrané výsledky.


Copyright (C) 2013-2017 J.Pelikán, last change: 2019-11-09 16:32:27 +0100 (Sat, 09 Nov 2019)