Alpha Blend

0

Czy ktoś wie jak zrobić, aby to coś działało na Win 98 SE ?

0

Mam teorie, ale nie wiem jak to zrobić:
kolor pixela na formie mixujesz w odpowiednich proporcjach z kolorem backgrounda i będzie działać. są do tego funkcje jak CreateROP4 czy rop2 ale jeszcze nigdy z nich nie kożystałem

0

mój autorski :

type
TPunkt = record // piksel sklada sie z dwóch współrzędnych
x,y : real;
end;

//-------

function MonoAlfa(source, dest, fade : word) : byte;
// result := fade * (dest - source) / 256 + source;
// zwraca składową koloru z zastosowaniem efektu Alpfa-Blending

asm
push ebx
mov ebx, 0
mov bx, source
sub dest, source
mov ax, dest
mul fade
shr ax, 8 // ax / 256
add ax, bx
pop ebx
end;

procedure rysujAlfa(punkt : TPunkt; fade : real; rysunek : TBitmap; transparent : TColor; plotno : Tcanvas);
var x, y : integer;
tempBmp, bmp : TBitmap;
linia, linia2, linia3 : PByteArray;
fade256 : integer;

begin
fade256 := trunc((1-fade)*256);

  tempBmp := TBitmap.Create;
  bmp := TBitmap.Create;
  tempBmp.PixelFormat:=pf24Bit;
  Bmp.PixelFormat:=pf24Bit;
  rysunek.PixelFormat:=pf24Bit;

  tempBmp.Width := rysunek.Width;
  bmp.Width := rysunek.Width;
  tempBmp.Height := rysunek.Height;
  bmp.Height := rysunek.Height;
  bmp.Canvas.CopyRect(rect(0,0,rysunek.width,rysunek.height),plotno,rect(round(punkt.x),round(punkt.y),round(punkt.x)+rysunek.width,round(punkt.y)+rysunek.height));

  try
     for y := 0 to rysunek.height - 1 do
            begin
              linia  := bmp.ScanLine[y];
              linia2 := rysunek.ScanLine[y];
              linia3 := tempBmp.ScanLine[y];
              x := 0;
              repeat
                   if rgb(linia2[x+2],linia2[x+1],linia2[x])  transparent then begin
                     linia3[x]   := MonoAlfa(linia2[x],linia[x],fade256);
                     linia3[x+1] := MonoAlfa(linia2[x+1],linia[x+1],fade256);
                     linia3[x+2] := MonoAlfa(linia2[x+2],linia[x+2],fade256);
                   end else begin
                     linia3[x]   := linia[x];
                     linia3[x+1] := linia[x+1];
                     linia3[x+2] := linia[x+2];
                   end;

                   x := x + 3;
              until x > (rysunek.Width-1)*3;
            end;
    plotno.Draw(round(punkt.x),round(punkt.y),tempBmp);
    except
      on E: Exception do obslugaWiadomosci('Nie mogę narysować bitmapki alfa z powodu : '+E.Message);
    end;
    bmp.free;
    tempBmp.free;

end;

potem w programie uzywasz go tak :
rysujAlfa(punkt, fade{od 0 do 1}, rysunek{jakas bitmapka TBitmap}, transparent{kolor przezroczystosci},plotno{canvas na ktorym rysujesz}

0

A moze wie ktos jak zrobic zeby to tak nie obciazalo systemu? Mam na formie text fader i text mi skacze :/ Zna ktos jakis sposob?

0

Jezeli ma to byc nawet mała animacja, czy nawet sam efekt to korzystaj z DelphiX : DirectDraw. Naprawdę polecam!

0

Ja tyz pisalem zrodelko do AlphaBledningu :) zobacz moze zadziala :)

www.icpnet.pl/~pinio

1 użytkowników online, w tym zalogowanych: 0, gości: 1