Что нового

Поиск по пикселям в изображении. Бот в фоне

teges

Знающий
Сообщения
18
Репутация
16
Ищем изображение из уже готового скриншота(тестировал на WoW). Все зависит только от скорости создания скрина. Но это хоть какое-то заменение захвату DirectX :whistle: В принципе можно прикрутить к какой-нибудь программе для создания ScreenShot'ов в фоне :scratch:
http://autoit-script.ru/index.php/topic,4462.0.html - поиск пикселей
+
http://autoit-script.ru/index.php/topic,6254.0.html - поиск скринов по времени создания
=
Код:
#include <GDIPlus.au3>
#include <WinAPIEx.au3>
#Include <Array.au3>
#Include <File.au3>

Global $inputDir = "Screenshots" ; Папка со сриншотами
Global $pixel ; Искомый пиксель
Global $mask = '*.jpg'
Global $status = False

;~ Проверка времени
$timer =0
$iTimer = TimerInit()
For $j = 1 To 99
_ScreenshotPixelSearch(300, 550, 400, 600, 0x00FFFF) ; - так выглядит запрос
ToolTip ($j, 0, 0)
Next
$timer = TimerDiff($iTimer) / $j
MsgBox(0, "Выполнено " & $j & " раз","Среднее время выполнения " & $timer &"мс")


Func _ScreenshotPixelSearch($x1, $y1, $x2, $y2, $color)
	$fileList = _FileListToArray($inputDir, $mask, 1)
	If IsArray($fileList) And $fileList[0] > 0 Then
		Dim $aTmp[UBound($fileList)][2]
		For $i = 1 To $fileList[0]
			$aTmp[$i][1] = $inputDir & '\' & $fileList[$i]
			$aTmp[$i][0] = FileGetTime($aTmp[$i][1], 0, 1)
		Next
		_ArraySort($aTmp, 1, 1)
	;~ Присваиваем имя скрина
		$screen = $aTmp[1][1]
		$status = True
	;~ Удаляем старые скриншоты
		If $fileList[0] > 0 Then
		  For $j = 2 To $fileList[0]
			FileDelete($aTmp[$j][1])
		  Next
		EndIf
	EndIf
	If $status Then
		$pixel = _PixelSearch($screen, $x1, $y1, $x2, $y2, $color)
		If Not @error Then 	Return $pixel
;~ 		MsgBox(0, "", "Искомый пиксель " & $pixel[0] &"x"& $pixel[1] & " " & $screen)
	EndIf
;~ MsgBox(0, "Error", "Ошибка функции ScreenshotPixelSearch")
  Return SetError(1)
EndFunc

Func _PixelSearch($hImage, $x1, $y1, $x2, $y2, $color, $step=1)
	If $x1 > $x2 Or $y1 > $y2 Then ; Ошибка в координатах
		MsgBox(0, "Error", "Проверьте координаты! - " & $x1 &"x"& $x2 &" "&  $y1 &"x"& $y2)
		Return SetError(1)
	EndIf
	_GDIPlus_Startup()
	$hImage = _GDIPlus_ImageLoadFromFile($hImage)
	$iWidth = _GDIPlus_ImageGetWidth($hImage)
	$iHeight = _GDIPlus_ImageGetHeight($hImage)
	$hBMP =_GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
	_GDIPlus_ImageDispose($hImage)
    $ARGB = _WinAPI_IntToDWord(BitOR($color, 0xFF000000))
    $L1 = $iWidth*($y1-1)+$x1
    $L2 = $iWidth*($y2-1)+$x2
    $L = $iWidth * $iHeight
    $tBits = DllStructCreate('dword[' & $L & ']')
    _WinAPI_GetBitmapBits($hBMP, 4 * $L, DllStructGetPtr($tBits))
	_GDIPlus_Shutdown()
    $Offset = -1
    For $i = $L1 To $L2 Step $step
        If DllStructGetData($tBits, 1, $i) = $ARGB Then
            $Offset = $i
            ExitLoop
        EndIf
    Next
    _WinAPI_DeleteObject($hBMP)
    _WinAPI_DeleteObject($tBits)
    If $Offset = -1 Then
        Return SetError(1)
    Else
        $x = Mod($Offset, $iWidth)
        $y = Ceiling($Offset / $iWidth)
        Local $coord[2] = [$x, $y]
        Return $coord
    EndIf
EndFunc

Довольно медленно, но на WoW хватает :smile:
 
Верх