Ihr Seite der absolute Hammer. Vielen Vielen Dank.
Ist echt unglaublich wenn man mit den Zeigern arbeitet wie schnell das geht.
also die alte Zeit im schlechtesten fall 14,7 sec.
die Zeit ohne canvas,Stream oder sonstwas ... sondern direkt mit Zeigern auf das Bitmap.
unglaubliche 0,0061 sec
Ich kann es nicht glauben juhu
nochmals vielen vielen Dank.
So sieht das Ergebnis aus.
Delphi-Quellcode:
function SearchBitmapInOtherBitmap( SearchBMP,ScreenBMP: TBitmap): TPoint;
type
TRGBTripleArray =
array [0..50000000]
of TRGBTriple;
pRGBTripleArray = ^TRGBTripleArray;
Var
x,y,k : Integer;
ScreenP,SearchP : pRGBTripleArray;
Laenge: integer;
RowYes,RowNo : integer;
Begin
// Startwerte
Result.X := -1;
Result.Y := -1;
RowYes := 0;
RowNo := 0;
if SearchBMP.PixelFormat <> ScreenBMP.PixelFormat
then
exit;
// { Himitsu }
// http://www.delphipraxis.net/202453-post16.html
Case SearchBMP.PixelFormat
of
pf1bit: Laenge := Ceil(SearchBMP.Width / 8);
pf4bit: Laenge := Ceil(SearchBMP.Width / 2);
pf8bit: Laenge := SearchBMP.Width;
pf15bit: Laenge := Ceil(SearchBMP.Width * 15 / 8);
pf16bit: Laenge := SearchBMP.Width * 2;
pf24bit: Laenge := SearchBMP.Width * 3;
pf32bit: Laenge := SearchBMP.Width * 4;
End;
// end case
Try
// Zeiger auf erste Pixelreihe in SearchP
SearchP := SearchBMP.ScanLine[0];
for y := 0
to ScreenBMP.Height - 1
do
begin
// Zeiger auf y Pixelreihe in ScreenP
ScreenP := ScreenBMP.ScanLine[y];
for x := 0
to ScreenBMP.Width - 1
do
begin
// Vergleiche beide Pixelreihen ob gleich
if CompareMem(SearchP,@ScreenP[x],Laenge)
then
begin
// Pixelreihe gefunden komplettes Suchbild prüfen
for k := 0
to SearchBMP.Height-1
do
begin
ScreenP := ScreenBMP.ScanLine[y];
if CompareMem(SearchP,@ScreenP[x],Laenge)
then inc(RowYes);
end;
// wenn gefunden und jede Pixelreihe dem des Suchbildes entspricht setz result : TPoint
if RowYes = SearchBMP.Height
then
begin
result.x := x;
result.Y := y;
exit;
end;
end;
// end If
end;
// end for x
end;
// end for y
except
raise Exception.Create('
Fehler bei SearchInPicture');
End;
End;
Es wird gesucht ein 50x50 Bitmap und einem 1920x1080 Bitmap.
Im schlechtesten Fall die angesprochenen 0,0061 sec.
nochmals Danke an alle die mir Tipps und Ratschläge gegeben haben. Vor allem der Hinweis es ohne Canvas zu probieren.
Grüße s0n