Graph64 - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Delphi

Graph64

graph64

2. prosince 2002, 00.00 | Pokud jste někdy zkoušeli pracovat v Delphi s grafikou, jistě jste po čase zjistili, že se standardními nástroji to není to pravé. Výsledek nevypadal dobře, byl pomalý a nebo viditelně blikal. Proto si v dnešním článku představíme jeden z mnoha projektů, který tento problém velmi rázně řeší.

Když jsem asi před několika lety začínal programovat v Delphi, byl jsem zcela unesen jednoduchostí tvorby programů v tomto vývojovém prostředí. Jednoduše jsem vkládal komponenty do formuláře a cítil se jako opravdový programátor. Ale jak jsem se dále učil programovat zjišťoval jsem , že pouze obyčejné komponenty mi nestačí k tomu, aby program vypadal alespoň trochu přitažlivě. A tak jsem se učil vytvářet graficky přitažlivé aplikace. Ty ale s nástroji dodávanými s Delphi vypadaly strašně a buďto zcela brzdily samotný běh programu a nebo neúnosně blikaly. Proto bych Vám dnes chtěl představit a taky přiblížit jeden z mnoha projektů, který tento problém velmi rázně řeší.
Bude se jednat o grafickou Unitu, napsanou společností NetGr@phic a pracovně pojmenovanou Graph64.pas (dále jen GE). Nemusíte se ale bát. Celý projekt a tudíž i samotný GE je šířen freeware. Domovskou stránkou firmy je www.netgraphics.sk/graph64/ , kde si také zmiňovaný GE můžete volně stáhnout.
Celý projekt má za sebou dlouhou historii a došlo již k kompletnímu přepsání od základů, které umožnilo s GE pracovat stejně jako s normální bitmapou v Delphi. GE ke své rychlosti využívá jazyk assembler, ve kterém je napsána většina funkcí.

Základy práce s GE

Pokud chceme vytvářet aplikace pomocí GE, musíme jako první připojit GE k našemu programu. K tomu slouží v Delphi direktiva USES. Druhou podmínkou je umístění souborů Graph64.pas a Screen64.pas v adresáři, ve kterém je uložen náš program nebo v jiném z knihovních adresářů Delphi. Tělo našeho programu musí vypadat následovně:

Unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 
  Graph64, Screen64;

Nyní už jen stačí vysvětlit, jak připojit GE k jakémukoliv objektu typu TBitmap. Provedeme proto deklaraci proměnných. Jelikož budou používány v celém programu, deklarujeme je jako globální třeba takto:

var 
scr: TScreen64;
bmp: TBitmap;

A jako každý objekt je třeba jej vytvořit. Globální objekty je výhodné vytvářet v těle události TForm.FormCreate. Zde také provedeme ono důležité propojení GE s naší Bitmapou. To se provádí funkcí TScreen64.LinkToBitmap . Celé to bude vypadat nějak takto:

procedure TForm1.FormCreate(Sender: TObject);
begin
bmp:=TBitmap.Create;
bmp.PixelFormat:=Graphics.pf32bit; //nastavení barevné holoubky bitmapy
bmp.Width:=width; //nastavení šířky a výšky Bitmapy
bmp.height:=height;
scr:=TScreen64.Create;
scr.LinkToTBitmap(bmp);
end;

Určitě se někteří z vás ptají proč jsem nastavil proměnnou PixelFormat na hodnoty pf32bit! Je to jedna z mála omezení, které nám GE přináší. Prozatím totiž GE nepodporuje všechny barevné hloubky, ale jen 15bpp a 32bpp a proto všechny použité Bitmapy musejí být v jednom z těchto dvou formátů, ale sám autor pilně pracuje na rozšíření a v budoucnu se určitě dočkáme i podpory 24bpp, která je v Delphi standardně použita. Prozatím ale je přednastavení nutné a při nedodržení může dojít k zhroucení celého programu! Pokud jsme ale vše nastavili správně, tak nám již nic nebrání v tom, abychom pracovali s objektem SCR jako s normální bitmapou. Jediný rozdíl je v tom, že nakonec vykreslujeme objekt BMP a ne SCR. Například kreslení kruhu bychom provedli např.:

scr.FillEllipse(25,25,250,250,Scr.rgb(0,0,255));
canvas.Draw(0,0,bmp);

A co to vlastně umí?

Prozatím to vypadá jakoby to jen nahrazovalo objekt TBitmap a neumělo nic nového. Ale zvídaví čtenáři již určitě zjistili, že oproti TBitmap má GE navíc několik funkcí, které jsou ale zcela zásadního charakteru. Konkrétně se jedná o vlastnosti BlendMode, PaintMode a BlendFilterMode. BlendMode a PaintMode můžeme libovolně nastavovat a jednu z hodnot : bmCopy, bmDisolve, bmLeans, bmGrayScale, bmBlend, bmLightness, bmDarkness, bmAlphaTransform, bmShadow, bmAxialTransparency . A BlendFilterMode na: fmNone (standardně nastaveno), fmDisolve, fmAlphaTransform. Rozdíl mezi PaintMode a BlendMode je v tom, že Blendmode se uplatni při kopírování mezi bitmapami funkcí Draw a PaintMode zase při samotném kresleni třeba u funkce FillRectangle. Ve zbytku článku si probereme jednotlivé funkce a jejich použití:

bmCopy: Tady je to jednoduché. Standardní kopírovaní shodné s funkcí Draw.

bmDisolve: Zde dochází k kopírování jen některých vybraných pixelů náhodně rozptýlených po celém obsahu bitmapy. Nedochází k žádné úpravě kopírovaných pixelů. Stupeň rozptýlení se nastavuje vlastností BlendParams objektu TScreen64 a je typu pointer. Jeho hodnoty jsou od 0 do 100. Tzn. Musí se nastavit např. takto:

d:=50;
scr.BlendParams:=@d;

bmLens: Velmi povedená funkce, která nám umožní mnoho pěkných efektů. Některé z nich je možné vidět v přídavných examplech. V podstatě je to speciální případ bmBlend a pro nastavení sfactor = 0.5; dfactor = 0.5; u bmBlend dostaneme shodný výsledek.

bmGrayScale: Jak název sám napovídá jedná se o převedení barevného obrázku do černobílé barvy (stupňů šedi).

bmBlend: Toto je jeden z nejdůležitějších parametrů a proto můžete vidět v ukázkovém programu k článku dvě jeho aplikace. K jeho použití je nutné nastavit a předat (opět jako ukazatel) BlendParams proměnnou typu TBlendSpec. Ten je deklarován v třídě Graph64 následovně:

TBlendSpec = packed record
    sfactor, dfactor: Single;
  end;

Hodnoty sfactor i dfactor mohou nabývat hodnot v rozsahu (0,1) a určují výsledný vzhled parametru bmBlend. Jeden z možných způsobů nastavení BlendParams je:

b.sfactor :=  TrackBar1.Position / 100; // b je typu TBlendSpec
b.dfactor := 1;
Scr.BlendParams := @b;

bmLightness: Výsledkem této operace je zesvětlení určité barevné složky RGB, záležící opět na nastavení parametru BlendParams. Tentokrát se ale předává jako ukazatel typ TRGBSpec, který má složky r;b;g, které jsou v rozsahu 0-255. Příkladem může být:

rgb.Red := 0;
rgb.Green:= 0;
rgb.Blue := 150;
Scr.BlendParams := @rgb; //rgb je typu TRGBSpec 

bmDarkness: Je opakem bmLightness. Tzn. Ztmavuje vybrané barvy o zadanou intenzitu. Opět se nastavuje pomocí ukazatele na proměnnou typu TRGBSpec.

bmAlphaTransform: Velmi zajímavým parametrem je AlphaTransform. Ten zajišťuje zkopírování jen těch pixelů, které mají svojí alpha složku větší, než hodnotu své opacity. K pochopení tohoto parametru je zapotřebí mít větší znalosti v oblasti počítačové grafiky. Hodnotu alfa-kanálu a hodnotu opacity předáváme ukazatelem typu TTransformSpec, definovaného jako:

TTransformSpec = packed record
    alpha : TBitmap64;
    frame : Byte;
    x,y: Integer;  //horní a levý pixel začátku
  end;

  trans.alpha := AlphaScr;     //AlphaScr je bitmapa s mapou alpha kanálu
  trans.frame := 100 // porovnávaná hodnota intenzity
  Scr.BlendParams := @trans; //trans je typu TTransformSpec

bmShadow: Vytváří obraz stínu dané bitmapy. Použití je zřejmé. Předává se tmavost a barva stínu jako ukazatel na výsledek operace Scr.rgb(i, i, i), kde i je požadovaná tmavost resp. světlost.

bmAxialTransparency: Tento parametr umožňuje kopírovat Bitmapu s aplikací tzv. osové transparentnosti. Pro bližší pochopení doporučuji prostudovat přiložený příklad. Typ pro nastavení BlendParams je TAxialSpec deklarovaný :

TAxialSpec = packed record
    AStart,
    AMiddle,
    AEnd: Byte;
  end;

Závěr:

K aplikaci této rozsáhlé unity bych musel napsat ještě min několik desítek stran než bych správně vystihl, co všechno v sobě GE skrývá. Sám autor GE nemá na vlastní manuál dostatek času, ale i tak věřím, že spoustě lidí tento článek usnadní a osvojí práci s GE natolik, že jej začnou používat ve svých aplikacích. Nám bude prozatím muset stačit tato skromná verze, na kterou se budu odkazovat v příštích článcích, kde se dočkáte aplikace GE v jedné velmi známe oblasti. Pokud někomu nestačí funkčnost GE, je možné si ji upravit podle svých představ. Podrobný návod na přidání dalšího BlendModu je na stránkách autora. Take doporučuji sledovat dlaší vývoj, protože již v brzké době se dočkáme konvolučního jádra, které nám umožní snadno a rychle implementovat spousty nových výkonných funkcí typu motion blur, antialiasing a bump maping.
Všem těm co nepochopili jakoukoli část článku nabízím svou pomoc, proto mi klidně své dotazy pište, buď na email nebo přímo do diskuze. Slibuji, že na většinu z nich odpovím.

Přiložené soubory:
Ukázka k článku (270kB)
Starší ukázkové soubory od knihovny (946kB) - neprezentují přesně aktuální verzi, ale jsou velmi kvalitní a názorné. Velmi snadno si vytvoříte představu co tato knihovna dokáže!

Tématické zařazení:

 » Rubriky  » Delphi  

 » Rubriky  » Windows  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: