Что нового

При изменение цвета пикселя во времени PixelSearch не успевает его "поймать"

Vic_

Новичок
Сообщения
6
Репутация
0
Ситуация стандартная найти координаты пикселя с заданным цветом в прямоугольнике, но при условии что этот пиксель, заданного цвета, то появляется, то исчезает в любой точке заданного прямоугольника. Пробовал PixelSearch, эта функция просто не успевает поймать нужный пиксель. Может кто нибудь уже решал подобную задачу или есть мысли по этому поводу. Может есть функции которые реагируют на изменение цвета пикселей в какой-то области, чтобы сузить прямоугольник поиска. Буду рад если поделитесь. Заранее спасибо.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Vic_

Например, http://autoit-script.ru/index.php?topic=13686.msg92026#msg92026
И вся тема, соответственно
WinAPIEx.au3 здесь:
http://autoit-script.ru/index.php/topic,47.0.html
 
Автор
V

Vic_

Новичок
Сообщения
6
Репутация
0
Спасибо, статические точки находит и быстро, а "бегающую" точку тоже не может поймать(. Мне нужно поймать объект который появляется в заданной области прямоугольника и начинает движение ограниченное уже намного меньшим прямоугольником (раз в 20 относительно первоначального) двигается в нём секунд 30 потом исчезает, потом появляется уже в другом месте и опять двигается и т.д. Но ни секунду не стоит всё время двигается, поймать (узнать координаты объекта) не получается(.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Vic_
Функция работает быстро, десятки миллисекунд, в цикле должно отлавливать

Код:
#include <Array.au3>
#include <WinAPIEx.au3>
#include <WindowsConstants.au3>


While 1
	$aTest = _PixelGetArray(0, 0, 50, 200, 0xFF0000)
	If $aTest[0][0] <> 0 Then ConsoleWrite($aTest[1][0] & '_' & $aTest[1][1] & @LF) ;  пишем в консоль координаты первого пикселя
	Sleep(10)
WEnd

Func _PixelGetArray($iX, $iY, $iWidth, $iHeight, $iColor, $hWnd = 0)
	Local $aPixels[$iWidth * $iHeight + 1][2]
	Local $hDC = _WinAPI_GetDC($hWnd)
	Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC)
	Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC, $iWidth, $iHeight)
	_WinAPI_SelectObject($hMemDC, $hBitmap)
	_WinAPI_BitBlt($hMemDC, 0, 0, $iWidth, $iHeight, $hDC, $iX, $iY, $SRCCOPY)
	_WinAPI_DeleteDC($hMemDC)
	_WinAPI_ReleaseDC($hWnd, $hDC)
	Local $iSize = $iWidth * $iHeight
	Local $tBits = DllStructCreate("dword[" & $iSize & "]")
	_WinAPI_GetBitmapBits($hBitmap, 4 * $iSize, DllStructGetPtr($tBits))
	Local $iCount = 0
	For $i = 1 To $iSize
		If BitAND(DllStructGetData($tBits, 1, $i), 0x00FFFFFF) = $iColor Then
			$iCount += 1
			$aPixels[$iCount][0] = Mod($i, $iWidth) - 1
			If $aPixels[$iCount][0] = -1 Then $aPixels[$iCount][0] = $iWidth - 1
			$aPixels[$iCount][1] = Ceiling($i / $iWidth) - 1
			ExitLoop ; выход из цикла при нахождении первого пикселя нужного цвета
		EndIf
	Next
	ReDim $aPixels[$iCount + 1][2]
	$aPixels[0][0] = $iCount
	Return $aPixels
EndFunc   ;==>_PixelGetArray
 
Верх