W jaki sposób można wykonać PixelSearch?

0

Witam.

Czy ktos się orientuje w jaki sposób można wykonać pixelsearch w delphi? Chodzi mi o programik, który wyszukiwałby pozycję jakiegos pixela i ją zapisywał powiedzmy w label1.

Dzięki.

0

Chodzi mi o programik, który wyszukiwałby pozycję jakiegos pixela i ją zapisywał powiedzmy w label1.

Jeżeli masz na myśli odnalezienie piksela na podstawie zadanego koloru i zwrócenie jego koordynatów w obrazie, to nie jest to trudne. Opcja powolna to skorzystanie z właściwości Canvas.Pixels, natomiast szybszą wersję można wykonać z użyciem ScanLine.

0

Jest może jakiś gotowiec, lub źródło, które można wykorzystać?
W autoit idzie znaleźć gotowca w 1 min:

#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 171, 102, 192, 124)
$Label1 = GUICtrlCreateLabel("Label1", 16, 8, 92, 30)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###



HotKeySet("{HOME}","start")
HotKeySet("{end}","stop")

while 2
sleep(100)
WEnd
func stop()
Exit
EndFunc
func start()
while 2
$Zmienna = PixelSearch(316, 64, 1404, 862, 0xFF0000,5)
if not @error Then
   GUICtrlSetData($label1,$zmienna[0] & ", " & $zmienna[1])
EndIf
WEnd
EndFunc



While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit






	EndSwitch
WEnd







Jednak mi zależy na tym, by label1.caption := inttostr(zmienna); w delphi.

1
function PixelSearch(ABitmap: TBitmap; AColor: TColor): TPoint;
var
  X, Y: Integer;
begin
  for Y := 0 to ABitmap.Height - 1 do
    for X := 0 to ABitmap.Width - 1 do
      if ABitmap.Canvas.Pixels[X, Y] = AColor then
        Exit(Point(X, Y));
        
  Result := Point(-1, -1);
end;

Wersja wolniejsza wygląda tak. Rezultat to współrzędne liczone od 0 dla obu wymiarów. Jeśli piksel o zadanym kolorze nie istnieje w wejściowej bitmapie to funkcja zwróci współrzędne [-1,-1]. Użycie bardzo proste:

var
  LPosition: TPoint;
begin
  LPosition := PixelSearch(MyBitmap, $FF0000);
  Label.Caption := Format('X: %d, Y: %d', [LPosition.X, LPosition.Y]);
0

Co mam wpisać w miejscu "mybitmap" żeby to działało?
Dodam, że mi chodzi o wyszukiwanie pixela na ekranie, a nie w konkretnej grafice.

1

Co mam wpisać w miejscu "mybitmap" żeby to działało?

Podać obiekt typu TBitmap z grafiką do sprawdzenia.

Dodam, że mi chodzi o wyszukiwanie pixela na ekranie, a nie w konkretnej grafice.

W takim razie, można zrobić zrzut ekranu i wrzucić obraz do bitmapki, a następnie ten obraz podać do funkcji szukającej. Tyle że przeszukanie całego pulpitu będzie czasochłonne, więc przyda się wersja zoptymalizowana. Jeszcze lepiej by było, gdyby funkcja miała szukać koloru w zadanym fragmencie pulpitu, a nie na całej jego powierzchni. Wtedy funkcja powinna pobierać dodatkowe liczby (jak w przykładzie z AutoIt), albo jeden parametr typu TRect.

Najszybszy sposób jaki przychodzi mi do głowy to skorzystanie z gołego Win32 API.


Wykonanie zrzutu ekranu jest dość proste:

procedure CaptureScreen(ABitmap: TBitmap);
var
  LHandle: HWND;
  LContext: HDC;
begin
  LHandle := GetDesktopWindow();
  LContext := GetWindowDC(LHandle);
  try
    ABitmap.LoadFromDevice(LContext);
  finally
    ReleaseDC(LHandle, LContext);
  end;
end;

Powyższy kod zrobi zrzut głównego ekranu pulpitu - dodatkowych ekranów (np. monitorów) nie przechwyci, więc jeśli zależy Ci na całym pulpicie to można ten kod rozszerzyć o taką funkcjonalność. Do tej procedury należy przekazać utworzony w pamięci obiekt typu TBitmap:

var
  LBitmap: TBitmap;
begin
  LBitmap := TBitmap.Create();
  try
    CaptureScreen(LBitmap);
    // dalsze operacje na bitmapie
  finally
    LBitmap.Free();
  end;

Kod sprawdzałem pod Lazarusem i działa prawidłowo - Delphi nie mam i nie używam, więc nie sprawdzę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1