Přehled rozdělení programu
Zde bude stručný popis jak má být program rozdělen.
Orientačně mělo by se jednat o tyto části:
1) Databáze a importování souborů podle standardu "WGS84 Datum"
Týká se standardu v pojmenovávání. Soubory se budou skládat ze dvou číslic, jedno označuje osu y a druhé osu x. Pozor!!! Google Maps a další poskytovatelé map online používají řazení číslic x, y. Já používám y_x.jpg nebo y_x.png z toho důvodu, že pak lze v průzkumníku snadno seřadit soubory (kliknete na typ souboru). Číslo zoomu zatím neuvádím, řadím soubory do složek. Jelikož k sestavení větší scenérie je třeba mnoho zdrojových souborů, tak je budu přesouvat do databáze.
Jak velká bude databáze zdrojových souborů? Hrubý odhad při rozměru 256x256px a maximální velikosti 18kb, LOD9 v zoomu 18 vychází na 4,2 Gbyte čistých dat. To by se vešlo na DVD. Nikdy nevěřte tomu, že se data z disku neztratí! Mě se občas stává že nejdou přečíst některé soubory, takže zálohovat asi budu. Soubory se po úpravě zvětší (větší ostrost obrazu). Sedm sad textur. Tj. 4+(7*4,2) . 33,4 Gigabyte celkem třeba na disku + místo pokud byste chtěli provádět konverzi mezi databázemi. Soubory png do toho nepočítám, masky a takové věci uložené v png. Tříkanálový png (rgb) zabírá max 6kb. Počítejme tedy zhruba polovinu téže velikosti na soubory png. Masky (černobílé obrazy png) nevím kolik budou zabírat ale asi kolem jednoho kilobytu, to už nemá smysl počítat. Bude tedy nejspíš 8x2 databází se zdrojovými soubory a pak databáze s maskami. Výhoda databází je v tom, že program nebude pořád hledat soubory, tím by se podstatně snižoval výkon a vznikala by fragmentace disku. Taktéž zálohování na DVD by mělo být snazší.
2) Slučování souborů
V programu bude vestavěný mechanismus na slučování souborů a to podle dvou různých pravidel.
A) do podmínky nastavíte minimální a maximální číslo y, do podmínky nastavíte minimální a maximální číslo x ... něco jako -join (0-80,2000-2080) by mělo sloučit soubory které začínají na y:0, končí na y:80, a pokračují od x:2000 až 2080). Prostě se soubory seřadí takto: 0_2000, 0_2001, 0_2002,... 0_2080 ... 1_2000, 1_2001, 1_2002,... 1_2080 až 80_2000, 80_2001, 80_2002,... 80_2080 . Sami se uspořádají a sloučí do jednoho obrazu. Ale musíte zaručit aby byli kompatibilní po šířce. Např. není možné sloučit tyto soubory 0_1 (rozměr 256x200), 0_2 (rozměr 256x56) protože nemají stejnou výšku. Na druhou stranu je ale možné sloučit 0_1 (rozměr 200x256), 0_2 (rozměr 56x256), protože když jdou vedle sebe tak odlišná šířka není problém. Číslo 80x80 nebo 2x1 označuje v jakém uspořádání mají být poslučovány (dva sloupce, jedna řada).
B) Chci udělat mechanismus který zjistí jaké čísla ma být v určitém lodu pro daný zoom. Když teda zadáte že chcete sloučit obrazy ze zoomu 18 do LODu 17 tak by to bylo takto: -join z=18 lod=17 (...) do závorky je třeba uvést jaké čísla souboru mají být očekávány, přičemž bude třeba zadat minimálně jedno číslo a to číslo levého horního rohu. Tu to zase začíná být trochu složitější, protože je třeba říct jaký levý okraj máme namysli, jaký mapový systém a jestli se řídit podle LODu nebo zoomu. Toto zatím není třeba do detailu rozepisovat, ale mohlo by to být třeba takto -join z=18 lod=17 (gluz=88469_142758). Použil jsem čtyři písmena, které označují: g - title system google maps, l - levá, u (upper) - horní, z - kachlice. Kdežto (trbz=88469_142758) by zase znamenalo že kachlice systému TMS se nachází v pravém dolním rohu (rb - right bottom). Podle toho bych mohl vypočítat všechny potřebné údaje - totiž kolik kachlic a jakým způsobem mají být uspořádány.
Napadá mě ještě jeden způsob značení, který by byl výhodnější. Najděte si na mapě čtverců Čáslav
Zadali bychom* něco jako
-join wgs84 g(lod11:1111,695->z=18->lod10). Pokud byste měli zkompletované textury pro zoom 18 o ploše LOD11 (kachle 1111,695 Čáslav) zadali byste tento příkaz na zkompletování všech textur ze zoomu 18 z dané oblasti LOD11 tak, že se vždy spojí ty soubory, že vzniknou velké soubory které budou tvořit čtverec LOD10. Součtem těchto čtverců LOD10 dostanete LOD11. To by byly čtyři čtverce (obrazy) složené z 128x128 čtverců (v pixelech 128x128x256x256). Jeden obraz by měl rozměr 655536px krát 65553px. Je to asi trochu moc :-) tak možná toto:
-join wgs84 g(lod13:2223,1390->z=18->lod12) by vytvořilo 4 čtverce (obrazy) o zoomu 18 a LODu 12 o velikosti 16384x16384. Zdá se to být ale stále dost přehnaně velké, tak co takhto:
-join wgs84 g(lod10:555,347->z=18->lod14) tj. strana 16x256px = rozměr 4096x4096. To už by snad šlo. Rozlišení by přitom bylo v zoomu 18. Bylo by to 16 velkých obrazů.
Co jsem chtěl říct touto zkrácenou formou zápisu? Provedlo by se mnoho cyklických akcí jedním jediným příkazem a nemuseli byste pořád opakovat ty samé příkazy s větším lodem a s jiným číslem x,y
Poznámka: Výše jsem použil značení x,y možná to tak bude lepší aby se to nepletlo, ale soubory budou pojmenovány jako y_x
Aby toho nebylo málo, tak mě napadá ještě možnost omezit výběr oblasti daného LODu, například nebudete chtít zpracovat celý LOD, ale třeba jen levou polovinu, pravou polovinu, apod. To by taky mělo mít svoje značení.
3) Převody v barvových prostorech, zejména na HSV + výběry barev
Jak jsem už psal v úvodním článku, HSV je klíčové pro definici barev se kterými chcete pracovat. Budu postupovat tak, že v obrazu vyberu předem nasbírané vzorky barev a ty budu upravovat tak aby vytvořily potřebný efekt (potlačení stínů pro noční textury, vytvoření sněhu, atd.).
Výběry barev by mělo být možné dělat z příkazového řádku, ale i ze souboru označeného např. koncovkou .sel (color selections) možná .def (color definitions). Tam by bylo možné nadefinovat rozsahy v jakých se barva nachází. Základní princip je v tom že pro každé písmeno (složku HSV) můžete označit rozsah. H se označuje ve stupních od 1 až 360° tuším že může být i desetinné číslo. S je saturace, normálně se značí jako desetinné číslo od 0 až 1, ale budeme používat procenta, V bude hodnota opět v procentech jako ve Photoshopu. V:90-100 značí že hledáte barvy které mají světlost či svítivost mezi 90 až 100%. S:90-100; to samé ale se saturací. H:10-50 značí že hledáte určitý odstín v daném barvovém rozsahu ve stupních. Výhoda tohoto zápisu: prohledává se pouze jedna vrstva. Další možnost, použít pro hledání barev dvě vrstvy. Například chci li najít oranžové barvy Budu hledat H:51-196,S:34-100. Vše si můžete sami vyzkoušet ve Photoshopu nebo možná pokud máte jiný program tak snad v něm najdete podobné značení. Pokud nenajdete stejné značení pak můžete použít tabulkový procesor například Libre Office a v tabulce si převést čísla na procenta. Nejpřesnější forma hledání by byla (51-196,34-100,50-100) zapsáno zkráceně. Samozřejmě jsem uvažoval nad tím jak zapsat když bych chtěl ty barvy změnit například provést náhradu za jinou barvu. To by se dalo provést přidáním další závorky s barvou za kterou to chceme zaměnit, nebo lépe uvést nějaký příkaz na změnu barev pomocí nějakého vzorce, nad tím budu muset ještě popřemýšlet. Mělo by se to pak chovat tak, aby se efekt změny barvy projevil v závislosti na tom jak blízko nebo daleko je od spodní nebo horní hranice výběru.
4) Odstraňování šumu
Funkce na odstranění defektů na fotografii. Fourierova transformace FFT a možná i DCT.
5) Korekce barev
Úprava barev, ostrosti,apod.
6) Speciální efekty
Tzv. blending efekty, viz úvodní článek.
7) Prace s vrstvama a maskama
K tomu budu používat textový soubor do kterého vepíšete co se má udělat s jednotlivými vrstvama.
Bude to sekvence příkazů. Základní myšlenka na takový soubor je:
Soubor bude mít koncovku .lay jako layers (vrstvy). Komentáře v souboru se budou dělat pomocí
# Komentář... Na každý řádek uvedete jednu vrstvu nebo jednu akci.
Budou zde dva nové termíny: paměť a pointer (ukazatel na paměť). První co do souboru napíšeme je počet pointerů se kterými chceme pracovat (počet vrstev, počet pamětí, které budeme chtít přidělit).
@200 #vytvoří paměť pro 200 pointerů. Každý pointer bude odkazovat na adresu v paměti ve které je uložen nějaký obraz (třeba maska). Tyto informace program potřebuje předem znát, jinak by nebyl schopen určit kolik paměti bude potřebovat pro práci.
*2:RGB # Hvězdička označuje vrstvu, kterou chceme založit a přidělit ji paměť. Bez přidělené paměti nelze začít pracovat, program by vypsal chybu. Za hvězdičkou uvedeme číslo vrstvy. Nemusí být automaticky 2. Uvědomte si, že program, bude pracovat z příkazového řádku. Napíšete nějaký příkaz ve kterém bude argument např. -lay reduce_shadows.lay , tím pádem se k příkazům z příkazového řádku přidají příkazy z toho souboru který "zrovna teď" píšu. Je logické, že při práci z vrstvama chceme také zdrojový soubor označit jako vrstvu. Například *1 -source:rgb file.jpg -rgb2hsv by mohlo otevřít soubor file.jpg v režimu RGB a následně ho převést na režim hsv, ale předtím jsem dal příkaz na vytvoření paměti pro danou vrstvu, správněji řečeno příkaz na vytvoření pointeru, který po otevření souboru ukazuje na ten soubor načtený v paměti. Takže v souboru lay teď zakládám pointer číslo 2 dvojtečkou mu přiděluji paměť o rozsahu tří kanálů. Pozn. Jeden kanál zabírá jeden byte, tedy 8 bitů, takže se jedná o 32 bitový soubor. Pokud by soubor obsahoval ještě alfa kanál (masku) tak by ho nešlo načíst do paměti. V takovém případě byste museli napsat *2:RGBA
Poté co máte paměť přidělenou označíte s kterou vrstvou chcete pracovat.
&2: # a dále napíšete příkazy a argumenty. Ampersand & zde říká že odkazuju na pointer vrstvy dva čili že tyto příkazy budou platit pro vrstvu dva. Celý příkaz se musí vejít na jeden řádek.
Teď nebudu do detailu rozebírat strukturu argumentů, na to je ještě hodně času. Při práci s vrstvama připravím nějaké ukázky jak to celé funguje. Vše je zatím teprve ve fázi návrhu. Zápis instrukcí do souboru mi přijde jako jediný způsob jak takové množství informací srozumitelně a přehledně zapsat.
Důležité: je třeba pamatovat na to, že máme omezené množství paměti a proto pokud některou vrstvu či masku už nebudeme potřebovat tak ji odstraníme z paměti příkazem release ... &2:release ...Taktéž důležité je vědět, že po na konci instrukcí musí zůstat přidělená jedna vrstva (jeden pointer) a to vrstva výstupní jinak by nebyl vrácen řádný výsledek. Zřejmě na toto bude na začátku další značka na označení výstupního pointeru (výstupní vrstvy). Možná vykřičník by mohl splňovat takovou roli. Po zpracování všech instrukcí bude hotový obraz obrazně řečeno předán do příkazového řádku, kde budeme pokračovat ve zpracování. Byla by možná vyjímka pro to, kdy by výstupem souboru .lay nebyl žádný obraz předávaný dál programu a to v případě, že se prostě rozhodneme obraz rovnou uložit něco jako: &2:save myfile.jpg
8) Export
Podobně jako import, tak i export dat do databáze. Bod 1 ovšem rozšířím o algoritmy výpočtu souřadnic a délek v m, tak aby bylo možné data a obrazy použít pro resample.exe na tvorbu scenérek bgl.
Žádné komentáře:
Okomentovat