Delphi - AlphaBlend

GDI újdonságai 4. rész

forráskód letöltése
Grafikai alkalmazásokban gyakran találkozhatunk olyan effekttel, amikor egy képet a másik fölé helyezünk úgy, hogy a felül lévő kép valamilyen fokban átlátszó. Létezik egy függvény, amellyel mi is megvalósíthatunk hasonló effektust. Erről lesz szó ebben a cikkben. Mindenekelőtt nézzük meg az AlphaBlend függvény paramétereit:
function AlphaBlend(DC: HDC; p2, p3, p4, p5: Integer; DC6: HDC; 
    p7, p8, p9, p10: Integer; p11: TBlendFunction): BOOL; stdcall;
A paraméterek jelentése:
DC
Annak a canvas-nak az azonosítója (Handle), ahová a képet másolni szeretnénk. (pl. Form1.Canvas.Handle).

p2, p3
A célkép X, és Y pozíciója.

p4, p5
A célkép szélessége és magassága.

DC6
A forrás kép canvas-ának azonosítója (pl. Image1.Canvas.Handle).

p7, p8
A forrás kép X és Y koordinátái.

p9, p10
A forrás kép szélessége és magassága.

p11
Egy TBlendFunction típusú rekord, amiben a művelet tulajdonságait kell beállítani. Ezt majd lejjebb, a forráskódnál láthatjuk!

Ha a forrás- és a célkép mérete nem egyezik meg, akkor a célkép ennek megfelelően átméretezve jelenik meg.

A Form-on elhelyeztünk egy TrackBar komponenst. Ennek Position property-je határozza meg a kép átlátszóságát, ezért a kép kirajzolást is a TrackBar OnChange eseményénél fogjuk elvégezni. Ahhoz, hogy lássuk is az eredményt, a kép alá egy kockás hátteret is rajzolunk. Ebből az is látszik, hogy a függvény nem csupán halványabban rajzolja meg a képet, hanem a kép alatti rajz is látható.
procedure TForm1.TrackBar1Change(Sender: TObject);
var BlendF:TBlendFunction;
    x,y, xp, yp:integer;
begin
Első lépésben megrajzoljuk a kockás hátteret, ami "fölé" az átlátszó képet másoljuk.
    with Image2.Canvas do
    begin
        Brush.Color:=clBtnFace;
        FillRect(Rect(0, 0, 128, 128));
        Brush.Color:=clBtnShadow;
        for x:=0 to 31 do
        for y:=0 to 31 do
        begin
            xp:=(x+(y mod 2))*4;
            yp:=(y+(x mod 2))*4;
            FillRect(Rect(xp, yp, xp+4, yp+4));
        end;
    end;
Most kerül sor az TBlendFunction rekord mezőinek beállítására. Az Első mező a BlendOp, aminek az értéke mindig 0. A BlendFlags mező értéke kötelezően 0. Ez a két mező valószínűleg későbbi fejlesztések miatt került bele a rekordba. A SourceConstantAlpha határozza meg a kép átlátszóságát. Ha az értéke 0, akkor a kép teljesen átlátszó lesz, míg. 255-nél, ami a maximálisan megadható érték, a kép egyáltalán nem lesz átlátszó, vagyis az eredmény az eredeti kép lesz. Az AlphaFormat mező értéke szintén 0.
    BlendF.BlendOp:=0;
    BlendF.BlendFlags:=0;
    BlendF.SourceConstantAlpha:=TrackBar1.Position;
    BlendF.AlphaFormat:=0;
Most már következhet a függvény felhasználása, vagyis a kép kirajzolása:
    AlphaBlend(
        Image2.Canvas.Handle, 0, 0, 128, 128,
        Image1.Canvas.Handle, 0, 0, 128, 128,
        BlendF);
end;

GDI újdonságai cikksorozat