PDA

View Full Version : سوال: چرا FloodFill ساخت خودم کمبود حافظه میاره؟



mbshareat
سه شنبه 12 بهمن 1389, 13:40 عصر
سلام علیکم
من دیشب یه تاپیک در مورد کار با +GDI ایجاد کردم . در اون تاپیک عنوان کردم که FloodFill تو Image فرم کار نمی کنه!
حالا خودم کدی برای رنگ آمیزی ناحیه تک رنگ نوشتم که چیزی شبیه FloodFill با پارامتر fsSurface میشه. مشکلش اینه که فقط تو ناحیه کوچک کار می کنه و در نواحی بزرگتر پیغام میده: Stack OverFlow !
کد به این شکل عمل می کنه که هر نقطه (به جز نقطه شروع) چهار طرف خودش رو به استثنای جهتی که از اون جهت به نقطه رسیدیم بررسی می کنه. اگه رنگ نقطه واقع در اون طرف با رنگ نقطه شروع یکی بودرنگ اون رو با رنگ جدید جایگزین می کنه !:لبخند:
طبق این تعریف هر نقطه حد اکثر چهار بار بررسی میشه اما نمی دونم چرا حافظه کم میاد!:گیج:
این هم کد:


Procedure FillX(Var B:TBitmap;X,Y:Integer;FillColor:TColor);
Var
//FBC->Fill RGB & BackGround Flat Area RGB!
FBC:TByteArray;
P,PFBC:PByteArray;
MaxW,MaxH:Word;
Procedure PaintPix(Const X,Y:Integer;Const SP:Byte);//Sa Source Position!
Begin
If (X<0) Or (X=MaxW) Or (Y<0) Or (Y=MaxH) Then
Exit;
P:=B.ScanLine[Y];
If (P[X*3]=PFBC[0]) And (P[X*3+1]=PFBC[1])
And (P[X*3+2]=PFBC[2])Then
Begin
P[X*3]:=PFBC[3];
P[X*3+1]:=PFBC[4];
P[X*3+2]:=PFBC[5];
End
Else
Exit;
If SP<>3 Then
PaintPix(X+1,Y,1);
If SP<>4 Then
PaintPix(X,Y+1,2);
If SP<>1 Then
PaintPix(X-1,Y,3);
If SP<>2 Then
PaintPix(X,Y-1,4);
End;
Begin
PFBC:=@FBC;
PFBC[0]:=GetBValue(B.Canvas.Pixels[X,Y]);
PFBC[1]:=GetGValue(B.Canvas.Pixels[X,Y]);
PFBC[2]:=GetRValue(B.Canvas.Pixels[X,Y]);
PFBC[3]:=GetBValue(FillColor);
PFBC[4]:=GetGValue(FillColor);
PFBC[5]:=GetRValue(FillColor);
If B.Canvas.Pixels[X,Y]=FillColor Then
Exit;
B.Canvas.Pixels[X,Y]:=FillColor;
MaxW:=B.Width;
MaxH:=B.Height;
PaintPix(X+1,Y,1);//Right
PaintPix(X,Y+1,2);//Down
PaintPix(X-1,Y,3);//Left
PaintPix(X,Y-1,4);//Up
B.Canvas.Refresh;
End;
کسی نمی دونه مشکل از کجاست؟:اشتباه: