![]() |
Scanline Schleife sehr langsam!?
Hi,
ich habe folgende Funktion um einen bestimmten Farbwert in einem Bitmap zu lokalisieren:
Delphi-Quellcode:
Das Bitmap wird mit folgendem Code erzeugt:
Function FindColor(bmp:TBitmap):TPoint;
type PixArray = array[1..3] of Byte; var i, iMax, x, y, w, h: Integer; p : ^PixArray; begin Result:=Point(-1,-1); Form1.ProgressBar1.Max := bmp.Height-1; for y := 0 to bmp.Height-1 do begin p := bmp.ScanLine[y]; Form1.ProgressBar1.Position := y; for x := 0 to bmp.Width-1 do begin if( (p^[3]=255) AND (p^[2]=0) AND (p^[1]=0) ) then begin Showmessage('Gefunden'); Result := Point(x, y); exit; end; end; end; end;
Delphi-Quellcode:
Meine Frage nun: Ist es möglich diesen Code zu optimieren (und ich hoffe es ist möglich =) ) und schneller zu machen???
var DC: HDC;
begin DC := GetDC(GetDesktopWindow); bmp:=TBitmap.Create; try bmp.Width := GetDeviceCaps(DC, HORZRES); bmp.Height := GetDeviceCaps(DC, VERTRES); BitBlt(bmp.Canvas.Handle,0,0,bmp.Width, bmp.Height, DC,0,0,SRCCOPY ); Finally ReleaseDC(GetDesktopWindow, DC); end; end; Vielen Dank für Eure Tipps :) |
Re: Scanline Schleife sehr langsam!?
Ja, es ist möglich.
Entferne das
Delphi-Quellcode:
aus der Schleife.
Form1.ProgressBar1.Position := y;
|
Re: Scanline Schleife sehr langsam!?
ok Danke :) aber gibt es noch Möglichkeiten? Ich hatte das ganze davor mit Canvas.Pixels gelöst und es war zwar auch langsam aber deutlich schneller als Scanline. Hatte gelesen das Scanline aber schneller als Pixels ist und dachte ich hätte nen Fehler?!?
|
Re: Scanline Schleife sehr langsam!?
|
Re: Scanline Schleife sehr langsam!?
Hi,
Folgendes geht bei mir ziemlich schnell:
Delphi-Quellcode:
procedure TForm1.Image1Click(Sender: TObject);
var i,j: Integer; p: PRGBQuad; bmp: TBitmap; begin bmp := TBitmap.Create; try bmp.Assign(Image1.Picture.Bitmap); bmp.PixelFormat := pf32Bit; for i:= 0 to bmp.Height-1 do begin p := bmp.ScanLine[i]; for j:= 0 to bmp.Width-1 do begin if PCardinal(p)^ = $00FF0000 then // farbe = clred, wobei clred <> $00FF0000. :stupid: ShowMessage('Rot gefunden'); inc(p); end; end; finally bmp.Free; end; end; |
Re: Scanline Schleife sehr langsam!?
Zitat:
in die innere Schleife muss noch ein inc(p)! [Edit] Mit einer Schleife gehts auch, was folglich auch schneller sein sollte (nur als Beispiel):
Delphi-Quellcode:
[/Edit]
procedure TForm1.Button1Click(Sender: TObject);
var i : integer; p:^TRGBTriple; begin image1.picture.bitmap.PixelFormat := pf24Bit; with image1.picture.bitmap do begin p := scanline[height-1]; for i := 0 to (height*width)-1 do begin if p^.rgbtRed = $FF then ShowMessage('ja'); inc(p); end; end; end; |
Re: Scanline Schleife sehr langsam!?
Super, vielen Dank!!! Geht echt sehr fix!
Aber eine Frage hab ich noch bzw. ein Problem: Die Funktion übergibt anscheinend falsche Koordinaten. Ich liege ca. immer 300 Pixel rechts von dem Farbpunkt. Woher kommt das, irgendeine Idee? |
Re: Scanline Schleife sehr langsam!?
@Flips: Du weißt schon, dass
Delphi-Quellcode:
nicht zwangsweise "Rot" (clred) sein muss?
if p^.rgbtRed = $FF then
|
Re: Scanline Schleife sehr langsam!?
hehe ja :)
hab aber das if aber auch so gemacht:
Delphi-Quellcode:
( (p^[3]=200) AND (p^[2]=140) AND (p^[1]=60) )
|
Re: Scanline Schleife sehr langsam!?
Zitat:
Natürlich müsste man auch noch den G und B Wert prüfen! |
Re: Scanline Schleife sehr langsam!?
um noch einmal auf mein Problem zurückzukommen :)
Die ganze Schleife geht Dank dem inc(p) inzwischen wirklich sehr schnell :) allerdings stimmen die Koordinaten x und y leider nicht ganz!? Die x Koordinate ist immer ca. 300px zu groß, weiß jemand woran das liegen könnte? Danke für die Mühen :) |
Re: Scanline Schleife sehr langsam!?
kann es etwas damit zu tun haben dass scanlines andersrum aufgebaut sind??
|
Re: Scanline Schleife sehr langsam!?
Ein Tipp. Nimm pf32Bit statt pf24Bit, respektive PRGBQuad statt PRGBTriple. Dann entspricht die Datengröße eines Pixels genau der Wortbreite eines 32 Bit Prozessors, sodass schneller darauf zugegriffen werden kann. ich würde außerdem empfehlen, nicht die RGB-Werte einzeln, sondern den gesamten Farbwert zu vergleichen, weil du hier die Rechenzeit für zwei vergleiche sparst.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:58 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