返璞归真1:256色模式下连通域的色替换源程! (1分)

  • 主题发起人 主题发起人 卷起千堆雪tyn
  • 开始时间 开始时间

卷起千堆雪tyn

Unregistered / Unconfirmed
GUEST, unregistred user!

procedure FillColors(Xs:integer;Ys:integer;OldColor,NewColor:Byte);
type stackfield=record
xl,xr,y:integer;
end;
var
i,X,y,Xl,Xr,p_Xl,p_Xr,signed_Y:integer;
P : PByteArray;
stack:array of stackfield;
procedure set_stack_empty();
begin
setlength(stack,10);
end;
function stack_not_empty():boolean;
begin
if stack[0].y=0 then
result:=false
else
result:=true;
end;
procedure push(xl,xr,y:integer);
begin
stack[0].y:=stack[0].y+1;
if stack[0].y>=length(stack) then
setlength(stack,length(stack)*2);
stack[stack[0].y].xl:=xl;
stack[stack[0].y].xr:=xr;
stack[stack[0].y].y:=y
end;
procedure pop(var xl:integer;var xr:integer;var y:integer);
begin
xl:=stack[stack[0].y].xl;
xr:=stack[stack[0].y].xr;
y:=stack[stack[0].y].y;
stack[0].y:=stack[0].y-1;
end;
begin
if ((Xs>Fwidth)or(Ys>FHeight))and(OldColor=0) then exit; //Fwidth,FHeight为位图的宽度和高度
set_stack_empty;//////////
P:=FBitmap.scanline[Ys];
i:=Xs;
if P=Newcolor then exit;
while P=OldColor do
begin
P:=NewColor;
i:=i+1;
end;
Xr:=i-1;
i:=Xs-1;
while P=OldColor do
begin
P:=NewColor;
i:=i-1;
end;
Xl:=i+1;
push(Xl,Xr,-(Ys-1));
push(Xl,Xr,(Ys+1));
while stack_not_empty do
begin
pop(p_Xl,p_Xr,signed_Y);
y:=abs(signed_Y);
P:=FBitmap.scanline[y];
if (P[p_Xl]=OldColor) then
begin
x:=p_Xl-1;
while (P[x]=OldColor) do
begin
P[x]:=NewColor;
x:=x-1;
end;
Xl:=x+1;
x:=p_Xl;
end
else
begin
x:=p_Xl;
while (p[x]<>OldColor)and(x<=p_Xr)do
begin
x:=x+1;
end;
xl:=x;
end;
while x<=p_Xr do
begin
while(p[x]=OldColor) do
begin
p[x]:=NewColor;
x:=x+1;
end;
Xr:=x-1;
if (Xl<p_Xl-1) then push(xl,p_Xl-1,-(signed_y-1));
if (Xr>p_Xr+1) then push(p_xr+1,xr,-(signed_y-1));
push(Xl,Xr,signed_y+1);
while (p[x]<>OldColor)and(x<=p_Xr) do
x:=x+1;
Xl:=x;
end;
end;
invalidate;
end;
 
老大就是老大。
不过你也解释一下程序干什么用的?(老大别骂我哟)
 
是不是运行太慢了?
 
运用的是 堆栈+扫描线 的操作,会慢么?
不会的!
 
可惜代码太长,没耐心看,先拷下来再说吧,卷兄的东西肯定是好东东!留下我的小名:me->Name=zyg_zm
 
堆栈会不会太深?
 
好用好用!!!
你要是有时间就帮我会答问题吧!!!!
 
[?]卷兄,能不能先告诉我,这东西是做什么的?
在下愚钝得很呀
 
看来~~~老大真的是“返璞归真”了不过俺不懂图象编程!~~~但也跟个贴
 
种子填充?

szchengyu
 
能解释一下吗?
 
后退
顶部