HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |