请教线程比较两幅图像的问题。 ( 积分: 100 )

  • 主题发起人 主题发起人 zygs
  • 开始时间 开始时间
Z

zygs

Unregistered / Unconfirmed
GUEST, unregistred user!
我在比较两幅图像时出现问题:
如果直接将 [blue]SBmp[/blue] 用 Fmain.Simage.Picture.Bitmap 代替,
[blue]DBmp[/blue] 用 Fmain.Dimage.Picture.Bitmap 代替,
能得到正确的比较结果,用SBMP 和 DBMP 来比较,无法得到正常结果。请帮我看看错误在哪里,非常谢谢大家。
能正常运行结果代码如下:
procedure TMoniSmAdd.Execute;
begin
IsExit:=False;
target:=False;
DBmp:=TBitMap.Create;
SBmp:=TBitMap.Create;
Synchronize(synchAddDataToControl);
While Not IsExit do
Begin
if target then
begin
HasBl:=True;
End;
Synchronize(synchAddDataToControl);
sleep(1000);
End;
DBmp.Free;
SBmp.Free;
Synchronize(EndTh);
end;

procedure TMoniSmAdd.EndTh;
begin
Fmain.BtStart.Caption := '开始';
end;

procedure TMoniSmAdd.synchAddDataToControl;
var
Dc:HDc;
CmpCanvas:TCanvas;
d,s:TRect;
i1,i2,j1,j2,cout:integer;
dep:Boolean;
fTarpos:Tpoint;
begin
If Fmain.BtStart.Caption = '开始' then
IsExit:=True;
isBl:= Fmain.ChkBl.Checked;

SBmp.Width := Fmain.SImage.Width;
SBmp.Height:= Fmain.SImage.Height;
DBmp.Width := Fmain.DImage.Width;
DBmp.Height:= Fmain.DImage.Height;
D:=Rect(0,0,Fmain.SImage.Width-1,Fmain.SImage.Height-1);
S:=D;
SBmp.Canvas.CopyRect(D,Fmain.SImage.Picture.Bitmap.Canvas,S);
D:=Rect(0,0,Fmain.DImage.Width-1,Fmain.DImage.Height-1);
S:=D;
DBmp.Canvas.CopyRect(D,Fmain.DImage.Picture.Bitmap.Canvas,S);
cout:=0;
fTarpos.X :=0;
fTarpos.Y :=0;
target:=false;
for i1:=0 to DBmp.Width - SBmp.Width-1 do
begin
for j1:=0 to DBmp.Height-SBmp.Height-1 do
begin
cout:=0;
for i2:=0 to SBmp.Width-1 do
begin
dep:=false;
for j2:=0 to SBmp.Height-1 do
begin
if SBmp.Canvas.Pixels[i2,j2]<>DBmp.Canvas.Pixels[i2+i1,j2+j1] then
{
[brown]这里的SBMP.Canvas.Pixels[i2,j2] 和 DBMP.Canvas.Pixels[i2,j2] 一直是-1,
如果用Fmain.Simage.Picture.bitmap.canvas.pixels[i2,j2] 和 
Fmain.Dimage.Picture.bitmap.canvas.pixels[i2,j2]能得到正常的结果。
不知道为什么SBMP 和 DBMP得到的值一直是-1。[/brown]}
begin
dep:=true;
break;
end;
cout:=cout+1;
end;
if dep then break;
end;
if cout = (SBmp.Width) * (SBmp.Height) then
begin
fTarpos.X :=i1;
fTarpos.Y :=Screen.Height *3 div 4+j1;
target :=true;
setcursorpos(fTarpos.X ,fTarpos.Y);
break;
end;
end;
if target then break;
end;
end;
 
我在比较两幅图像时出现问题:
如果直接将 [blue]SBmp[/blue] 用 Fmain.Simage.Picture.Bitmap 代替,
[blue]DBmp[/blue] 用 Fmain.Dimage.Picture.Bitmap 代替,
能得到正确的比较结果,用SBMP 和 DBMP 来比较,无法得到正常结果。请帮我看看错误在哪里,非常谢谢大家。
能正常运行结果代码如下:
procedure TMoniSmAdd.Execute;
begin
IsExit:=False;
target:=False;
DBmp:=TBitMap.Create;
SBmp:=TBitMap.Create;
Synchronize(synchAddDataToControl);
While Not IsExit do
Begin
if target then
begin
HasBl:=True;
End;
Synchronize(synchAddDataToControl);
sleep(1000);
End;
DBmp.Free;
SBmp.Free;
Synchronize(EndTh);
end;

procedure TMoniSmAdd.EndTh;
begin
Fmain.BtStart.Caption := '开始';
end;

procedure TMoniSmAdd.synchAddDataToControl;
var
Dc:HDc;
CmpCanvas:TCanvas;
d,s:TRect;
i1,i2,j1,j2,cout:integer;
dep:Boolean;
fTarpos:Tpoint;
begin
If Fmain.BtStart.Caption = '开始' then
IsExit:=True;
isBl:= Fmain.ChkBl.Checked;

SBmp.Width := Fmain.SImage.Width;
SBmp.Height:= Fmain.SImage.Height;
DBmp.Width := Fmain.DImage.Width;
DBmp.Height:= Fmain.DImage.Height;
D:=Rect(0,0,Fmain.SImage.Width-1,Fmain.SImage.Height-1);
S:=D;
SBmp.Canvas.CopyRect(D,Fmain.SImage.Picture.Bitmap.Canvas,S);
D:=Rect(0,0,Fmain.DImage.Width-1,Fmain.DImage.Height-1);
S:=D;
DBmp.Canvas.CopyRect(D,Fmain.DImage.Picture.Bitmap.Canvas,S);
cout:=0;
fTarpos.X :=0;
fTarpos.Y :=0;
target:=false;
for i1:=0 to DBmp.Width - SBmp.Width-1 do
begin
for j1:=0 to DBmp.Height-SBmp.Height-1 do
begin
cout:=0;
for i2:=0 to SBmp.Width-1 do
begin
dep:=false;
for j2:=0 to SBmp.Height-1 do
begin
if SBmp.Canvas.Pixels[i2,j2]<>DBmp.Canvas.Pixels[i2+i1,j2+j1] then
{
[brown]这里的SBMP.Canvas.Pixels[i2,j2] 和 DBMP.Canvas.Pixels[i2,j2] 一直是-1,
如果用Fmain.Simage.Picture.bitmap.canvas.pixels[i2,j2] 和 
Fmain.Dimage.Picture.bitmap.canvas.pixels[i2,j2]能得到正常的结果。
不知道为什么SBMP 和 DBMP得到的值一直是-1。[/brown]}
begin
dep:=true;
break;
end;
cout:=cout+1;
end;
if dep then break;
end;
if cout = (SBmp.Width) * (SBmp.Height) then
begin
fTarpos.X :=i1;
fTarpos.Y :=Screen.Height *3 div 4+j1;
target :=true;
setcursorpos(fTarpos.X ,fTarpos.Y);
break;
end;
end;
if target then break;
end;
end;
 
后退
顶部