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