Szybsze rysowanie skórki

0

Witam
Do stworzenia nietypowego widoku okna, używam poniższej funkcji, która wycina zbędne fragmenty okna (tutaj w kolorze różowym) bitmapy.
Mam takie pytanie. Jak tę funkcję przerobić, by była szybsza? Używam tutaj metody canvas.pixels, a zdaje się szybsza jest ScanLine, ale mimo wielu prób nie potrafię tego zastosować do poniższego (funkcja pochodzi z CoolForm, odpowiednio dostosowana).

Naglowek
function GenerujMaskeG(BitMap: TBitmap; transparentcolor: TColor; Panelik: TForm): boolean;


function TForm1.GenerujMaskeG(BitMap: TBitmap; transparentcolor: TColor;  Panelik: TForm): boolean;
var
  x,y	      : integer;
  rgn1, rgn2  : hrgn;
  startx,endx : integer;
begin
  result:=false;
  rgn1 := 0;
  for y := 0 to BitMap.Height-1 do
  begin
    x:=0;
    repeat
      while (bitmap.canvas.pixels[x,y] = transparentcolor) and (x = BitMap.width) do
      inc(x);
      startx:=x;
      inc(x);
      while (bitmap.canvas.pixels[x,y]<>transparentcolor) and (x<=BitMap.width) do
      inc(x);
      endx:=x;
      if startx<>BitMap.Width then
      begin
        if endx= BitMap.Width then dec(endx);
        if rgn1 = 0 then
        begin
          rgn1 := createrectrgn(startx+1,y,endx,y+1);
        end else
        begin
          rgn2 := createrectrgn(startx+1,y,endx,y+1);
          if rgn2<>0 then combinergn(rgn1,rgn1,rgn2,RGN_OR);
          deleteobject(rgn2);
        end;
      end;
    until x>=BitMap.width-1;
  end;

  if (rgn1<>0) then
  begin
     SetWindowRgn(panelik.Handle,rgn1,true);
     result:=true;
  end;
end;
 Wywołanie:
    GenerujMaskeG(Image1.Picture.Bitmap,rgb(255,0,255),Form1);

Prosze o pomoc.
Jak szybciej stworzyc region na podstawie wiekszej bitmapy (u mnie obrazek w TImage, 403Kb, czas generowania okna, okolo 2s, ;( )
Pozdr, pepe

0

To i tak szybko. Używanie tablicy Pixels[] jest wolne. Skorzystaj może z metody ScanLine().

0

Jesli system to NT to mozesz zamiast tego uzyc transparentcolor, wtedy nawet bedziesz mogl zmieniac rozmiary okna.

0

Ja polecam zwiększyć obszary regionów wycinanych, bo tutaj masz regiony 1x1, a to bardzo zwalnia.. Może być przy tym konieczne zmienienie formatu skórki czy coś, ale im większy region tym będzie to zdecydowanie szybsze

0

CoolForm mial cos takiego, ze region (maske) mozesz zapisac do pliku, potem zaladowac, ladowanie trwa tyle co zaladowanie obrazka do TImage, wiec to tez jest wyjscie ...

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