Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Mit Scanline einen bestimmten Bereich auslesen (https://www.delphipraxis.net/57593-mit-scanline-einen-bestimmten-bereich-auslesen.html)

Baal 23. Nov 2005 19:22


Mit Scanline einen bestimmten Bereich auslesen
 
hi,

ich möchte mit Scanline einen bestimmten bereich eines bildes auslesen und auswerten

über die suche bin ich leider nich fündig geworden

diesen code habe ich aus der DP


Delphi-Quellcode:
procedure TForm1.Scan(h: HWND);
var
BitMap : TBitMap;
P: PRGBQuad;
y, x: integer;
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile('maple.bmp');
BitMap.PixelFormat:= pf32Bit;

for y := 310 to 420 do
begin
P := BitMap.ScanLine[y];

for x := 348 to 372 do //360
begin
If ( P^.rgbRed = 173 ) And ( P^.rgbGreen = 33 ) And ( P^.rgbBlue = 0 ) Then
Begin
if x<=365 then sendkeys('left,Y',true);
if x>365 then sendkeys('right,Y',true);
End;

If ( P^.rgbRed = 0 ) And ( P^.rgbGreen = 85 ) And ( P^.rgbBlue = 173 ) Then
Begin
if x<=365 then sendkeys('left,Y',true);
if x>365 then sendkeys('right,Y',true);
End;
Inc(P);
end;
end;
finally
BitMap.Free;
end;
end;
wenn ich mit Scanline nun scanne dann liest er das ganze bild ein und beim auswerten
gibt er mir falsche werte, er erkennt nur farbwerte am anfang des bildes ich möchte aber welche aus der mitte

Danke für die hilfe

turboPASCAL 23. Nov 2005 19:49

Re: Mit Scanline einen bestimmten Bereich auslesen
 
Habs jetzt nicht durchgeschaut, bringt BitMap.PixelFormat:= pf24Bit eine besserung?

Khabarakh 23. Nov 2005 20:01

Re: Mit Scanline einen bestimmten Bereich auslesen
 
@turboPASCAL: Dann muss PRGBQuad aber auch durch PRGBTriple ersetzt werden. Es sollte aber beides funktionieren.

@Baal: Du hast zwar die Werte der for-Schleife angepasst, der Pointer zeigt aber immer noch auf das erste Pixel der Reihe.

Delphi-Quellcode:
for y := 310 to 420 do
begin
  P := BitMap.ScanLine[y];
  // P^ = Erstes Pixel der Reihe y

  Inc(P, 348); // 349. Pixel
  for x := 348 to 372 do
  begin
    If ( P^.rgbRed = 173 ) And ( P^.rgbGreen = 33 ) And ( P^.rgbBlue = 0 ) Then
    Begin
      if x<=365 then sendkeys('left,Y',true);
      if x>365 then sendkeys('right,Y',true);
    End;
    [...]

    Inc(P); // Nächstes Pixel
   end;

turboPASCAL 23. Nov 2005 20:37

Re: Mit Scanline einen bestimmten Bereich auslesen
 
Zitat:

Zitat von Khabarakh
@turboPASCAL: Dann muss PRGBQuad aber auch durch PRGBTriple ersetzt werden. Es sollte aber beides funktionieren.

Jupp, hast recht. ;)

Baal 23. Nov 2005 21:57

Re: Mit Scanline einen bestimmten Bereich auslesen
 
danke für den tip

leider klappt es noch nicht :?
liest der jetz auch wirklich nur das viereck von (348;310) bis (372;420) aus
oder das ganze bild?

turboPASCAL 24. Nov 2005 10:16

Re: Mit Scanline einen bestimmten Bereich auslesen
 
Zitat:

liest der jetz auch wirklich nur das viereck
Ja.

Was funktioniert denn nicht, die Steuerung ?

Baal 24. Nov 2005 19:52

Re: Mit Scanline einen bestimmten Bereich auslesen
 
entweder is das zu langsam oder eben es geht nicht?

turboPASCAL 24. Nov 2005 23:53

Re: Mit Scanline einen bestimmten Bereich auslesen
 
Das wird wohl an der Sache mit dem sendkeys('left,Y',true); liegen.
Wenn du die Graphik scanst wird ja jeder Pixel in ein Key umgewandelt und gesendet...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.

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