Что нового

Нужно увеличить скорость работы скрипта по поиску пикселей

S_K

Новичок
Сообщения
30
Репутация
0
Описание:
скрипт ищет опорный пиксель, и окружающие пиксели рядом
например есть 5 красных точек какие разбросаны на изображении, он находит ту красною точку с какой рядом ещё несколько цветов: синий,зеленой,желтой,голубой, и наводит мышью на красною точку с какое рядом эти цвета

этой поиск пикселей занимает больше 5 секунд - это очень много
Вопрос такое, как можно уменьшить это время ?

Примечания:

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

HotKeySet("{ESC}", "_Exit")
HotKeySet("{F3}", "Find")

While Sleep(100)
WEnd

Func Find()
  $Array = _PixelGetArray(0, 0, @DesktopWidth, @DesktopHeight, 0xED1C24)
  If Not $Array[0][0] Then
     ConsoleWrite("Не найдены опорные пиксели")
    Return
  EndIf
  For $i = 1 To $Array[0][0]
    If GetSurround($Array[$i][0], $Array[$i][1], 0xFFF200, 0x00A2E8, 0xFFC90E, 0xB5E61D) Then
      MouseMove($Array[$i][0], $Array[$i][1], 0)
      ConsoleWrite("Найдено: X=" & $Array[$i][0] & ", Y=" & $Array[$i][1])
      ExitLoop
    EndIf
  Next
  If $i > $Array[0][0] Then ConsoleWrite("Не найдены окружающие пиксели")
EndFunc

Func _PixelGetArray($i_X, $i_Y, $i_Width, $i_Height, $i_Color, $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, $SRCCOPY)
  _WinAPI_DeleteDC($h_MemDC)
  _WinAPI_ReleaseDC($h_Wnd, $h_DC)
  $t_Bits = DllStructCreate('dword[' & $i_Size & ']')
  $p_Bits = DllStructGetPtr($t_Bits)
  _WinAPI_GetBitmapBits($h_Bitmap, 4 * $i_Size, $p_Bits)
  _WinAPI_DeleteObject($h_Bitmap)
  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
  ReDim $a_Pixels[$a_Pixels[0][0] + 1][2]
  Return $a_Pixels
EndFunc

Func GetSurround($X, $Y, $Left, $Right, $Up, $Down)
  If  PixelGetColor($X - 1, $Y) = $Left _
  And PixelGetColor($X + 1, $Y) = $Right _
  And PixelGetColor($X, $Y - 1) = $Up _
  And PixelGetColor($X, $Y + 1) = $Down Then Return True
  Return False
EndFunc

Func _Exit()
  Exit
EndFunc
 

Вложения

  • 1pixel (100%).png
    1pixel (100%).png
    288 байт · Просмотры: 118

Prog

Продвинутый
Сообщения
537
Репутация
65
Если устроит решение в виде dll, вызываемой из кода на AutoIt - пишите в личку.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
S_K
зачем искать на все рабочем столе ? уменьши область поиска до нужной. если буквально по картинке, то она малого размера. находит быстро
я открыл картинку в программе просмотра изображений и запустил функцию с такими параметрами(это в моем конкретном случае)
Код:
_PixelGetArray(398, 268, 86, 66, 0xED1C24)
 
Верх