Einzelnen Beitrag anzeigen

sonny2007

Registriert seit: 27. Aug 2009
39 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#28

AW: Thread läuft nicht parallel --

  Alt 10. Jan 2014, 14:49
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

Geändert von sonny2007 (10. Jan 2014 um 15:27 Uhr)
  Mit Zitat antworten Zitat