iamOmg
Новичок
- Сообщения
- 97
- Репутация
- 2
Версия AutoIt: v3.3.14.0
Описание:
На форуме есть отличный скрипт для поиска всех координат нужного цвета, работает безотказно но вот со скоростью проблемы. На ноутбуке с двухъядерным core i5 прямоугольник с разрешением 1500x500 прогоняет за 2 секунды, если искать цвет с оттенком то время работы будет уже 4 секунды и выше. Это слишком много, учитывая что у многих до сих пор ещё dual core`ы стоят.
Единственным выходом в такой ситуации, как подсказали люди на форуме, может быть только перевод функции в dll или машинный код. Прошу помощи у знающих пользователей форума.
Примечания:
Скрипт поиска
Описание:
На форуме есть отличный скрипт для поиска всех координат нужного цвета, работает безотказно но вот со скоростью проблемы. На ноутбуке с двухъядерным core i5 прямоугольник с разрешением 1500x500 прогоняет за 2 секунды, если искать цвет с оттенком то время работы будет уже 4 секунды и выше. Это слишком много, учитывая что у многих до сих пор ещё dual core`ы стоят.
Единственным выходом в такой ситуации, как подсказали люди на форуме, может быть только перевод функции в dll или машинный код. Прошу помощи у знающих пользователей форума.
Примечания:
Скрипт поиска
Код:
#include <WinAPIGdi.au3>
$iT = TimerInit()
$aPixels = _PixelGetArray(100, 100, 10, 10, 0x000000, 10)
ConsoleWrite(TimerDiff($iT) & @LF)
#include <Array.au3>
_ArrayDisplay($aPixels)
Func _PixelGetArray($i_X, $i_Y, $i_Width, $i_Height, $i_Color, $i_Shade = 0, $h_Wnd = 0, $f_FirstOnly = False)
Local $i_Size = $i_Width * $i_Height, $a_Pixels[$i_Size + 1][2] = [[0]], $h_DC, $h_MemDC, $h_Bitmap, $t_Bits, $i_Index
$h_DC = _WinAPI_GetDC($h_Wnd)
$h_MemDC = _WinAPI_CreateCompatibleDC($h_DC)
$h_Bitmap = _WinAPI_CreateCompatibleBitmap($h_DC, $i_Width, $i_Height)
_WinAPI_SelectObject($h_MemDC, $h_Bitmap)
_WinAPI_BitBlt($h_MemDC, 0, 0, $i_Width, $i_Height, $h_DC, $i_X, $i_Y, 0x00CC0020) ; $SRCCOPY
_WinAPI_DeleteDC($h_MemDC)
_WinAPI_ReleaseDC($h_Wnd, $h_DC)
$t_Bits = DllStructCreate('dword[' & $i_Size & ']')
_WinAPI_GetBitmapBits($h_Bitmap, 4 * $i_Size, DllStructGetPtr($t_Bits))
_WinAPI_DeleteObject($h_Bitmap)
If $i_Shade Then
Local $a_RGB[3] = [BitAND(BitShift($i_Color, 16), 0xFF), BitAND(BitShift($i_Color, 8), 0xFF), BitAND($i_Color, 0xFF)]
For $i = 0 To $i_Height - 1
For $j = 0 To $i_Width - 1
$i_Index += 1
Local $i_Clr = BitAND(DllStructGetData($t_Bits, 1, $i_Index), 0x00FFFFFF)
Switch BitAND(BitShift($i_Clr, 16), 0xFF)
Case $a_RGB[0] - $i_Shade To $a_RGB[0] + $i_Shade
Switch BitAND(BitShift($i_Clr, 8), 0xFF)
Case $a_RGB[1] - $i_Shade To $a_RGB[1] + $i_Shade
Switch BitAND($i_Clr, 0xFF)
Case $a_RGB[2] - $i_Shade To $a_RGB[2] + $i_Shade
$a_Pixels[0][0] += 1
$a_Pixels[$a_Pixels[0][0]][0] = $j + $i_X
$a_Pixels[$a_Pixels[0][0]][1] = $i + $i_Y
If $f_FirstOnly Then ExitLoop 2
EndSwitch
EndSwitch
EndSwitch
Next
Next
Else
For $i = 0 To $i_Height - 1
For $j = 0 To $i_Width - 1
$i_Index += 1
If BitAND(DllStructGetData($t_Bits, 1, $i_Index), 0x00FFFFFF) = $i_Color Then
$a_Pixels[0][0] += 1
$a_Pixels[$a_Pixels[0][0]][0] = $j + $i_X
$a_Pixels[$a_Pixels[0][0]][1] = $i + $i_Y
If $f_FirstOnly Then ExitLoop 2
EndIf
Next
Next
EndIf
ReDim $a_Pixels[$a_Pixels[0][0] + 1][2]
Return $a_Pixels
EndFunc ;==>_PixelGetArray