|
|
Szürkeárnyalat készítése tetszőleges képből
|
|
Példaprogram letöltése
18107 bájt
|
Ebben a példában egy olyan komponenst készítünk a TGraphicControl-ból származtatva, mely képes arra, hogy megjelenítsen egy tetszőleges bitmap-ot úgy, hogy a képet csak szürkeárnyalatosan mutatja. Amikor viszont a felhasználó az egérrel a komponens területe fölé ér, akkor a kép eredetiben, minden színével lesz látható. Amint az egér elhagyja a komponenst, a kép ismét szürkeárnyalatosan jelenik meg.
A mellékelt példaprogram megnyitása előtt a GrayPic.pas-ban lévő komponenst telepítenie kell a Delphi alá.
A komponensbe képet a Bitmap property-n keresztül tölthetünk be.
Ha az AutoSize property-t igazra állítjuk, akkor a komponens mérete igazodik a kép méretéhez.
Ha a Transparent property-t állítjuk igazra, akkor a betöltött kép áttetsző lesz és így láthatóvá válik a mögötte lévő háttér. Hogy a kép melyik színe lesz áttetsző az attól függ, hogy a kép bal alsó sarkában lévő pixel milyen színű.
A megvalósításhoz két grafikai effektet kell megvalósítanunk: az egyik az áttetsző kép kirajzolása, a másik a szürkeárnyalat létrehozása egy tetszőleges kép alapján. Az első feladattal egy régebbi cikkünkben (lásd: alábbi hivatkozások) már foglalkoztunk, így a most felhasznált TransparentBlt eljárást nem részletezzük újra. A szürkeárnyalat képzése úgy történik, hogy a kép minden egyes pixelét felbontjuk a három színösszetevőre (piros, zöld, kék) majd az így kapott három szám átlagát visszaírjuk az adott pixel minden egyes színösszetevőjére.
...
for i:=0 to bmp.Width-1 do begin
c:=(r1[i].rgbtRed+r1[i].rgbtGreen+r1[i].rgbtBlue) div 3;
with r2[i] do begin
rgbtRed:=c;
rgbtGreen:=c;
rgbtBlue:=c;
end;
end;
...
Ahhoz, hogy a pixelenkénti feldolgozás elfogadható sebességű legyen, nem a Canvas Pixels property-ét használjuk fel, hanem a ScanLine property-t, ahol egy-egy mutatót kapunk, mely egy olyan tömbre mutat, amelyben a kép egy teljes sora elérhető úgy, hogy a tömb minden egyes eleme megfelel a kép sorának egy-egy pixeleként.
További megoldandó feladat annak figyelése, hogy az egér mikor ér a komponens fölé és mikor hagyja el annak területét. Ez a két esemény lesz az a pont, amikor újra kell rajzolnunk a komponens területét, egyszer a színes képpel, egyszer pedig a szürkeárnyalatossal.
Ennek figyelésére kiválóan alkalmas a CM_MOUSEENTER és a CM_MOUSELEAVE esemény.
Amikor valamelyik bekövetkezik, akkor csak annyi a teendőnk, hogy tároljuk az FMouse globális logikai változóba, hogy aktuálisan hol található az egér, majd az Invalidate hívásával újrarajzoltatjuk a komponens területét.
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 104. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|