1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
procedure Tfrm_ImgSearchMain.btn_DeepSearchClick(Sender: TObject);
var
LstrOri, LStrPat, I, J, IPos,
SPos : Integer;
R : TRect;
StrOri, StrPat : Ansistring;
Time1 : Int64;
Found, LineEnd: boolean;
WPat, HPat, WOri,HOri ,
HVisite, WVisite : Integer;
begin
Time1 := MyGetTickCount;
WPat := ImgPat.Picture.Bitmap.Width;
HPat := ImgPat.Picture.Bitmap.Height;
WOri := ImgOri.Picture.Bitmap.Width;
HOri := ImgOri.Picture.Bitmap.Height;
LStrPat := WPat * 3;
LStrOri := WOri * 3;
SetLength(StrPat,LStrPat);
SetLength(StrOri, LstrOri);
MoveMemory(PByte(@StrPat[1]), ImgPat.Picture.Bitmap.ScanLine[0], LStrPat);
R := Rect(0, 0, WPat,HPat);
HVisite := HOri - HPat;
WVisite := WOri - WPat;
for I := 0 to HVisite do
begin
MoveMemory(PByte(@StrOri[1]), ImgOri.Picture.Bitmap.ScanLine[I], LstrOri);
IPosFirst := 0;
repeat
/////////////////////////////////////
repeat // on cherche la premiere ligne de motif
IPosFirst := IPosFirst + 1;
IPosFirst := PosEx(StrPat,StrOri, IPosFirst);
until (IPosFirst = 0) or (IPosFirst mod 3 = 1);
/////////////////////////////////////
if (IPosFirst <> 0) then
begin // si premier ligne trouvé alors on cherche le reste
/////////////////////////////////////
Found := True;
for J := 1 to HPat - 1 do
begin
MoveMemory(PByte(@StrPat[1]), ImgPat.Picture.Bitmap.ScanLine[J], LStrPat);
MoveMemory(PByte(@StrOri[1]), ImgOri.Picture.Bitmap.ScanLine[I + J], LstrOri);
SPos := PosEx(StrPat,StrOri, IPosFirst);
if (IPosFirst <> SPos) then
begin
Found := False;
Break;
end;
end;
/////////////////////////////////////
if Found then
begin // ok occurance trouvé
OffsetRect(R, IPosFirst div 3, I);
Caption := Format('%d', [MyGetTickCount - Time1]);
ImgOri.Canvas.Rectangle(R);
MessageDlg(Format('Concordance trouvée aux coordonées%sLeft: %d%sTop: %d', [#13#13, R.Left, #13, R.Top]), mtInformation, [mbOk], 0);
ImgOri.Canvas.Rectangle(R);
Exit;
end;
/////////////////////////////////////
end;
LineEnd := (IPosFirst = 0) or (IPosFirst >= (WVisite) * 3);
Inc(IPosFirst, WPat * 3);// ici c'est pas bon
until LineEnd;
end;
MessageDlg('Fin de traitement. Concordance non trouvée', mtWarning, [mbOk], 0);
end; |
Partager