Delphi - Tetszőleges alakú kép kirajzolása árnyékkal

forráskód letöltése

Grafikai programokban gyakran találkozhatunk az árnyék effekttel. Most egy olyan eljárást készítünk, amely egy tetszőleges alakú képet (átlátszó háttérszínű) rajzol meg úgy, hogy az árnyék több tulajdonságát is megadhatjuk: távolság, intenzitás, elmosódottság. A példaprogramba tetszőleges képet betölthetünk, az átlátszó szín a bal alsó pixel színe lesz. A betöltött képet az egérrel mozgathatjuk a háttérképen.

Az eljárás deklarációja a következőképpen néz ki:
procedure DropShadowPic(Picture: TBitmap; Dest: HDC; X, Y: integer; TranspColor: TColor; XOffs,
    YOffs: integer; Intensity: byte; Blur: integer);
A Picture paraméterben kell megadni a kép objektumát. A Dest paraméter a cél Canvas azonosítója (Handle). Az X és Y a kép bal felső sarkának pozíciója, az XOffs és YOffs pedig az árnyék eltolásának mértéke X és Y irányban. Az XOffs és YOffs paraméterek értéke lehet negatív is. A TranspColor paraméterben adhatjuk meg azt a színt, ami a képen az átlátszó szín lesz. Az Intensity az árnyék intenzitása, erőssége. A legmagasabb érték (255) fekete, míg a legkisebb (0) teljesen átlátszó árnyékot eredményez. A Blur paraméter az árnyék elmosása. Az elmosás mértéke a paraméter értékével egyenes arányban nő. A legkisebb érték mellett (0) az árnyék nem lesz elmosva.

Az eljárásban először is előállítunk egy maszkot. A maszk mérete 2-2 pixellel szélesebb illetve magasabb, mint a kép. Ennek az árnyék elmosásánál lesz jelentősége. A maszkban a kép minden egyes pixeljéhez egy bájt tartozik. Ha a pixel színe háttérszínű (TranspColor), akkor a bájt értéke 255, egyébként pedig az intenzitás 255-ből levont értéke. Ha tehát az intenzitás 255, akkor a bájt értéke 0 lesz.
Miután elkészítettük ezt a maszkot, az ebben tárolt értékeket összemossuk. Ez úgy történik, hogy minden pixel intenzitását a szomszédos pixelek intenzitásának átlagára állítjuk be. Ezt annyiszor végezzük el, amennyi a Blur paraméter értéke.
A maszkot a háttérkép pixeleinek manipulálásához használjuk fel. Ahol a maszkban található bájt értéke 255, ott az eredeti szín marad meg, ahol pedig 0, ott csak az árnyék színe lesz látható. Ha a bájt értéke 128, akkor a pixel színe 50%-kal lesz sötétítve. Nyilván, ha az intenzitás értéke csak 64, akkor a sötétítés maximális értéke csak 25% lehet.

Létrehozunk egy TBitmap típusú objektumot, amire átmásoljuk a háttérkép azon részét, amelyre az árnyék kerül. Egy ciklusban ennek a területnek a pixeleit a maszkban tárolt értékek alapján a megfelelő mértékben elsötétítjük, majd a kapott képet visszamásoljuk a háttérképre. Ezután már csak ki kell rajzolnunk a képet a TransparentBlt függvénnyel a megadott pozícióba.