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.
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.
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
.
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.
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]);
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.
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ę.