Úloha 052: Omezená barevná transformace obrázku

Úkolem je implementovat barevnou transformaci rastrového obrázku (využívající například barevný prostor HSV). Vstupem je obraz načtený z disku, výstupem obrázek stejné velikosti s přepočítanými barvami. Je nutné vymyslet takovou transformaci, při které některé barvy zůstávají nezměněné (pleť?) nebo se v různé části spektra transformace chová různě.

Základ

Jako základ poslouží projekt 052colortransform z repository grcis. Je připravena jednoduchá aplikace, ve které uživatel zadává vstupní obrázek a po stisku tlačítka "Recompute" se spouští metoda Transform.TransformImage() přepočítávající obrázek do výstupu. Tuto metodu musíte přeprogramovat, příslušný úsek kódu je ve zdrojáku Transform.cs označen závorkami:

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

Svoje úpravy kódu nemusíte omezovat na oblast vyznačenou těmito závorkami. Můžete samozřejmě přidat nějakou pomocnou třídu, datovou strukturu, apod. Všechny modifikace však musíte soustředit do tohoto jednoho odevzdávaného souboru.

Technické detaily

Vstupní i výstupní obrázky jsou předávány jako parametry (typ Bitmap) spolu s parametrem string param pro další řízení vašeho algoritmu (parsování číselných hodnot je v pilotním řešení naznačeno, zejména dodržujte mezinárodní zápis desetinných čísel .. desetinná tečka). Z obrázku se čte po jednotlivých pixelech metodou Bitmap.GetPixel(), nová barva (Color) se zapisuje do výsledného obrázku metodou Bitmap.SetPixel().

Pozor: výsledný obrázek musíte v metodě Transform.TransformImage() sami vytvořit - viz vzorový kód. Rozměry okopírujte ze vstupního obrázku.

Efektivnější práce s jednotlivými pixely: pokročilejší programátoři mohou místo málo efektivního přístupu po pixelech použít metody Bitmap.LockBits() a Bitmap.UnlockBits() a jednotlivé pixely si sami adresovat pomocí ukazatelů (v "unsafe" bloku kódu!).

Jako řešení úlohy posílejte mailem pouze modifikovaný zdrojový soubor Transform.cs! Nepřijímám celé VS2010 projekty. V případě použití nějakého zajímavého obrázku (se kterým dává Váš program pěkné výsledky), přiložte i ten obrázek spolu s popisem zadání dané operace. Zvlášť zajímavé textové parametry můžete připsat i bez obrázků. Případné obrázky jen v rozumně malém rozlišení!

Ovládání programu

Tlačítka myši mají v aplikaci speciální funkci: poklepání levým tlačítkem smaže z textového parametru vše začínající znakem "[" a místo toho zapíše trojicí barvy "[R,G,B]" z obrázku v místě, kde stojí myš. Poklepání pravým tlačítkem má podobnou funkci, jen z textového parametru nic neodstraňuje (můžete tedy pravým tlačítkem přidávat více barev na konec).

Barevné převody

Pro převádění z RGB systému do HSV a zpět můžete použít metody MathSupport.Arith.ColorToHSV() a MathSupport.Arith.HSVToColor(), jejich použití je v pilotní implementaci naznačeno v komentáři.

Inspirace

Máte za povinnost zachovávat některé barevné odstíny (např. pleťové) či implementovat složitější barevnou transformaci definovanou po částech. Můžete měnit jasovou složku nebo sytost, přebarvovat ("Hue shift"), apod. Do doprovodného mailu nebo do komentáře napište, jakou transformaci jste udělali, s jakým omezením, a co vás k tomu inspirovalo.

Termín

Odevzdat do: 16. 11. 2014

Body

Základ: 8 až 12 bodů podle zajímavosti
Bonus: za výjimečné řešení

Projekt

Visual Studio 2010 projekt: 052colortransform

Zdrojový soubor

Modifikujte a odevzdejte pouze soubor: Transform.cs
Do komentáře na první řádce napište své jméno!
Můžete poslat/vystavit i jeden nebo dva vhodné vstupní obrázky v nějakém rozumném rozlišení

Data

Pro testování můžete použít pár obrázků přímo z repository, z adresáře data


Copyright (C) 2010-2014 J.Pelikán, last change: 2019-05-09 17:52:59 +0200 (Thu, 09 May 2019)