AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread läuft nicht parallel --

Ein Thema von sonny2007 · begonnen am 9. Jan 2014 · letzter Beitrag vom 11. Jan 2014
 
sonny2007

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

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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz