Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Scanline Schleife sehr langsam!? (https://www.delphipraxis.net/120696-scanline-schleife-sehr-langsam.html)

chrizl08 15. Sep 2008 14:07


Scanline Schleife sehr langsam!?
 
Hi,
ich habe folgende Funktion um einen bestimmten Farbwert in einem Bitmap zu lokalisieren:

Delphi-Quellcode:
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;
Das Bitmap wird mit folgendem Code erzeugt:
Delphi-Quellcode:
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;
Meine Frage nun: Ist es möglich diesen Code zu optimieren (und ich hoffe es ist möglich =) ) und schneller zu machen???

Vielen Dank für Eure Tipps :)

Neutral General 15. Sep 2008 14:11

Re: Scanline Schleife sehr langsam!?
 
Ja, es ist möglich.

Entferne das

Delphi-Quellcode:
Form1.ProgressBar1.Position := y;
aus der Schleife.

chrizl08 15. Sep 2008 14:14

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?!?

smallsmoker 15. Sep 2008 14:15

Re: Scanline Schleife sehr langsam!?
 
[ot]
habe ne andere idee zu deinem problem
habe ich hier gepostet
[/ot]

Neutral General 15. Sep 2008 14:26

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;

Flips 15. Sep 2008 14:47

Re: Scanline Schleife sehr langsam!?
 
Zitat:

Zitat von chrizl08
Delphi-Quellcode:
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;

Der Code kann auch gar nicht ordentlich funktionieren,
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:
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;
[/Edit]

chrizl08 15. Sep 2008 15:49

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?

Neutral General 15. Sep 2008 15:58

Re: Scanline Schleife sehr langsam!?
 
@Flips: Du weißt schon, dass

Delphi-Quellcode:
if p^.rgbtRed = $FF then
nicht zwangsweise "Rot" (clred) sein muss?

chrizl08 15. Sep 2008 16:00

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) )

Flips 15. Sep 2008 16:37

Re: Scanline Schleife sehr langsam!?
 
Zitat:

Zitat von Neutral General
@Flips: Du weißt schon, dass

Delphi-Quellcode:
if p^.rgbtRed = $FF then
nicht zwangsweise "Rot" (clred) sein muss?

Jaja schon klar, war ja auch nur ein schnell hingeschludertes Beispiel ;-)
Natürlich müsste man auch noch den G und B Wert prüfen!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz