![]() |
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! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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 by Thomas Breitkreuz