Przyciemnianie części programu

0

Witam. Chciałbym się zapytać czy zna ktoś jakiś skuteczny sposób na przyciemnienie jakiejś cześci programu, np. jak to ma miejsce w niektórych skryptach Ajaxa (przykład chociażby tutaj: http://www.huddletogether.com/projects/lightbox2/. Oczywiście efekt po kliknięciu w obrazek ;)). Próbowałem zrobić to przy pomocy obrazka i tego kodu:

var
  Alfa, x, y : Integer ;
  r1,g1,b1,r2,g2,b2,rk,gk,bk: Integer;
begin

  Alfa := StrToInt(Edit1.Text); //poziom przezroczystości od 0-255

  for y := 0 to Image1.Height do
    for x:= 0 to Image1.Width do
    begin
      r1:=GetRValue(Image1.Canvas.Pixels[x, y]); //pobieranie czerwonego koloru do zmiennej
      g1:=GetGValue(Image1.Canvas.Pixels[x, y]); //pobieranie zielonego koloru do zmiennej
      b1:=GetBValue(Image1.Canvas.Pixels[x, y]); //pobieranie niebieskiego koloru do zmiennej

      r2:=GetRValue(Image2.Canvas.Pixels[x, y]); //pobieranie czerwonego koloru do zmiennej
      g2:=GetGValue(Image2.Canvas.Pixels[x, y]); //pobieranie zielonego koloru do zmiennej
      b2:=GetBValue(Image2.Canvas.Pixels[x, y]); //pobieranie niebieskiego koloru do zmiennej

      //obliczanie średniego koloru pixela
      rk:=(alfa*((r2+64)-r1)) div 256 + r1 - (alfa div 4);
      gk:=(alfa*((g2+64)-g1)) div 256 + g1 - (alfa div 4);
      bk:=(alfa*((b2+64)-b1)) div 256 + b1 - (alfa div 4);

      // wyświetlanie wszystkiego w Image1
      Image1.Canvas.Pixels[x, y]:=RGB(rk,gk,bk);
    end;
end;

Co prawda działa to, ale zmiana Alpy jest mało płynna i trwa z sekundę, co przy serii przyciemniania/rozjaśnienia nie wygląda estetycznie... Bardzo proszę o pomoc.

Pozdrawiam

0

Co prawda działa to, ale zmiana Alpy jest mało płynna i trwa z sekundę,

A ja podrasowałem twój kod bez scanline ;-P

var
  Form1: TForm1;

implementation

{$R *.dfm}
var
  Bm1,Bm2: TBitmap;
  T1: array of array of TColor;
  T2: array of array of TColor;

procedure TForm1.Button1Click(Sender: TObject);  // **** Draw ******
var
  Alfa : byte;
  x, y : integer ;
  r1,g1,b1,r2,g2,b2,rk,gk,bk: byte;
  a,b,c: integer;
begin
  if Button2.Enabled then
    begin
      ShowMessage('Pierw załaduj zdjecia');
      exit;
    end;

  a:= GetTickCount;

  Alfa := StrToInt(Edit1.Text); //poziom przezroczystości od 0-255

 for y := 0 to Bm1.Height-1 do
 for x:= 0 to Bm1.Width-1 do
    begin
      r1:=GetRValue(T1[x, y]); //pobieranie czerwonego koloru do zmiennej
      g1:=GetGValue(T1[x, y]); //pobieranie zielonego koloru do zmiennej
      b1:=GetBValue(T1[x, y]); //pobieranie niebieskiego koloru do zmiennej

      r2:=GetRValue(T2[x, y]); //pobieranie czerwonego koloru do zmiennej
      g2:=GetGValue(T2[x, y]); //pobieranie zielonego koloru do zmiennej
      b2:=GetBValue(T2[x, y]); //pobieranie niebieskiego koloru do zmiennej

      //obliczanie średniego koloru pixela
      rk:=(alfa*((r2+64)-r1)) div 256 + r1 - (alfa div 4);
      gk:=(alfa*((g2+64)-g1)) div 256 + g1 - (alfa div 4);
      bk:=(alfa*((b2+64)-b1)) div 256 + b1 - (alfa div 4);

      Bm1.Canvas.Pixels[x,y]:= RGB(rk,gk,bk);
    end;

  Image1.Canvas.Draw(0,0,Bm1);   // wyświetlanie wszystkiego w Image1

   b:= GetTiCkCount;
   c:= b-a;
   caption:= inttostr(c)+ ' ms';   // 16ms
end;

procedure TForm1.Button2Click(Sender: TObject); // ***** Load ****
var
x,y : integer;
begin
  Bm1:= TBitmap.Create;
  Bm2:= TBitmap.Create;
  Bm1.LoadFromFile('b1.bmp');
  Bm2.LoadFromFile('b2.bmp');
  SetLength(T1, Bm1.Width, Bm1.Height);
  SetLength(T2, Bm1.Width, Bm1.Height);

  for x:= 0 to Bm1.Width-1 do
    for y := 0 to Bm1.Height-1 do
      begin
        T1[x,y]:= GetPixel(Bm1.Canvas.Handle,x,y);
        T2[x,y]:= GetPixel(Bm2.Canvas.Handle,x,y);
      end;
  Button2.Enabled:= False;
end;

Efekt? 15x szybciej

0

Ooo, dzięki Panowie :). O to mi właśnie chodziło :)

Pozdrawiam

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