Findcolor (Lua): различия между версиями

Материал из UoPilot
Перейти к навигации Перейти к поиску
 
(не показано 13 промежуточных версий 2 участников)
Строка 8: Строка 8:
 
<br>Работа со свернутым окном: Нет.
 
<br>Работа со свернутым окном: Нет.
 
<br>Работа с перекрытым окном: Да. Привязка к окну обязательна.
 
<br>Работа с перекрытым окном: Да. Привязка к окну обязательна.
   a = findcolor (StartX, StartY, EndX, EndY, ShiftX, ShiftY, '(RequiredColor)', '%ResultArray' [, type [, count [, deviation]]] [, 'abs'])
+
   a = findcolor (StartX, StartY, EndX, EndY, ShiftX, ShiftY, '''['''[('RequiredColor')]''']''', '%ResultArray' [, type [, count [, deviation]]] [, 'abs'])
 
где:
 
где:
 
<br>
 
<br>
Строка 15: Строка 15:
 
'''<EndX EndY>''' - координаты правого нижнего угла области поиска<br>
 
'''<EndX EndY>''' - координаты правого нижнего угла области поиска<br>
 
'''<ShiftX ShiftY>''' - шаг поиска по осям X и Y соответственно. Почти всегда указывают равным "1".<br>
 
'''<ShiftX ShiftY>''' - шаг поиска по осям X и Y соответственно. Почти всегда указывают равным "1".<br>
'''<'(RequiredColors)'>''' - один или несколько цветов для поиска (в круглых скобках!). Могут указываться отдельные RGB каналы и/или цвета в виде значений и/или диапазонов:<br>
+
'''<'(RequiredColor)'>''' - один или несколько цветов для поиска (в круглых скобках!). Могут указываться отдельные RGB каналы и/или цвета в виде значений и/или диапазонов:<br>
 
:'(84235)' - точный десятичный цвет<br>
 
:'(84235)' - точный десятичный цвет<br>
 
:'(84235-86027)' - диапазон десятичных цветов<br>
 
:'(84235-86027)' - диапазон десятичных цветов<br>
Строка 27: Строка 27:
 
Если вместо "2" или "1" указать "workwindow" (переменная содержащая хендл рабочего окна), то поиск будет происходить в привязанном рабочем окне (и в его относительных координатах). По сути, это третий тип поиска. При этом окно может быть частично или полностью закрыто другими окнами (но не свёрнуто!).<br>
 
Если вместо "2" или "1" указать "workwindow" (переменная содержащая хендл рабочего окна), то поиск будет происходить в привязанном рабочем окне (и в его относительных координатах). По сути, это третий тип поиска. При этом окно может быть частично или полностью закрыто другими окнами (но не свёрнуто!).<br>
 
'''[count]''' (необязательно)- количество найденных пикселей, после которых поиск прерывается. Если просто нужно определить наличие цвета в заданной области и не важно общее число таких пикселей, то можно указать "1" - и скорость работы команды будет оптимальной. Если параметр не указывать, то будет искаться максимальное число пикселей<br>
 
'''[count]''' (необязательно)- количество найденных пикселей, после которых поиск прерывается. Если просто нужно определить наличие цвета в заданной области и не важно общее число таких пикселей, то можно указать "1" - и скорость работы команды будет оптимальной. Если параметр не указывать, то будет искаться максимальное число пикселей<br>
'''[deviation]''' !!!НЕ РАБОТАЕТ!!!<br>
+
'''[deviation]''' (необязательно) - погрешность оттенка. Указывается в %. Например: есть погрешность 3%. Точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.<br>
 
'''['abs']''' (необязательно) - этот параметр указывается, если вы ищете пиксели в координатах относительно верхнего левого угла экрана. Если не указывать параметр, то поиск будет идти в координатах рабочего окна текущего скрипта.
 
'''['abs']''' (необязательно) - этот параметр указывается, если вы ищете пиксели в координатах относительно верхнего левого угла экрана. Если не указывать параметр, то поиск будет идти в координатах рабочего окна текущего скрипта.
  
Строка 43: Строка 43:
 
  findoffsetx (-40)  -- смещение влево на 40 пикселей
 
  findoffsetx (-40)  -- смещение влево на 40 пикселей
 
  findoffsety (-60)  -- смещение вверх на 60 пикселей
 
  findoffsety (-60)  -- смещение вверх на 60 пикселей
 
  
 
== Примеры ==
 
== Примеры ==
 
  --lua
 
  --lua
 
  -- Пример 1
 
  -- Пример 1
  a =  findcolor (339, 501, 341, 631, 1, 1, '(207)', '%close', 2) -- поиск в рабочем окне
+
  local a =  findcolor (339, 501, 341, 631, 1, 1, '''['''[('207')]''']''', '%close', 2) -- поиск в рабочем окне
  log(#arr) -- вывести в лог длину массива arr
+
  log(#close) -- вывести в лог длину массива close
 +
 
 +
--lua
 +
-- Пример 2
 +
-- Использование отклонения цвета - deviation
 +
local c = findcolor (0, 0, 100, 100, 1, 1, '''['''[('207')]''']''', '%arr', 2, 10, 3)  -- 2 - это тип поиска
 +
                                                                            -- 10 - количество найденных пикселей
 +
                                                                            -- 3 - погрешность оттенка
 +
 +
if c then -- если найден нужный цвет
 +
  move (arr[1][1], arr[1][2]) -- переместить курсор мыши
 +
  log ('Пикселей найдено -> ' .. c .. '\nКоординаты X -> ' .. arr[1][1] .. '\nКоординаты Y -> ' .. arr[1][2] )
 +
end
 +
 
 
Этот пример означает следующее: в текущем рабочем окне в области с координатами (339,501)-(341,631) с шагом поиска (1,1) ищутся все пиксели с десятичным цветом 207. Все найденные координаты пикселей будут записаны в массив close. Тип поиска = 2 (быстрый).<br>
 
Этот пример означает следующее: в текущем рабочем окне в области с координатами (339,501)-(341,631) с шагом поиска (1,1) ищутся все пиксели с десятичным цветом 207. Все найденные координаты пикселей будут записаны в массив close. Тип поиска = 2 (быстрый).<br>
 
В результате работы, если в данной области будет обнаружено 2 пикселя с цветом 207, то в элемент массива close[1][1] будет записано значение координаты X для первого пикселя, в close[1][2] будет записано значение координаты Y  для первого пикселя, в close[2][1] - значение X для второго пикселя, в close[2][2] - значение Y для второго пикселя,<br>
 
В результате работы, если в данной области будет обнаружено 2 пикселя с цветом 207, то в элемент массива close[1][1] будет записано значение координаты X для первого пикселя, в close[1][2] будет записано значение координаты Y  для первого пикселя, в close[2][1] - значение X для второго пикселя, в close[2][2] - значение Y для второго пикселя,<br>
 
В a будет записано число найденных пикселей = 2 (или 0, если бы такие пиксели не были найдены).
 
В a будет записано число найденных пикселей = 2 (или 0, если бы такие пиксели не были найдены).
// Пример 2
 
set #b findcolor ( 339 501 341 631 1 1(207) %close 2 abs )    // поиск на экране
 
 
// Пример 3
 
set #c findcolor ( 339 501 341 631 1 1 (207) %close workwindow )    // поиск в рабочем окне (даже в перекрытом)
 
 
// Пример 4
 
set #d findcolor (403, 138 973, 502 1 1 (3949430) %arr 2)
 
if #d > 0          // если найден нужный цвет, то делаем двойной левый клик мышкой в первой найденной точке
 
  double_left %arr [1 1], %arr [1 2]
 
else
 
  msg Цвет не найден!
 
end_if
 
 
// Пример 5
 
// Использование отклонения цвета - deviation
 
set #d findcolor (403, 138 973, 502 1 1 (3949430) %arr 2 -1 3)  // 2 - это тип поиска
 
                                                                  // -1 - количество найденных пикселей (искать все)
 
                                                                  // 3 - погрешность оттенка
 
if #d > 0          // если найден нужный цвет
 
  kleft %arr [1 1], %arr [1 2]
 
  wait 2000
 
else
 
  log Цвет не найден!
 
end_if
 
 
// Пример 6
 
// Использование шага поиска
 
// Допустим, найти 2 одинаковых изображения в сетке 3*3. 
 
set #a findcolor (100 100 200 200 50 50 2366701 %a)    // проверить 9 точек на цвет 2366701
 
                                                        // координаты: 100 100, 150 100, 200 100
 
                                                        //            100 150, 150 150, 200 150
 
                                                        //            100 200, 150 200, 200 200                                                                 
 
log #a                              // вывод в лог количества найденных цветов
 
if #a > 1                          // если найдено больше 1 точки
 
    for #i 1 size(%a)               
 
        log %a [#i 1] %a [#i 2]    // вывод в лог координат
 
        move %a [#i 1] %a [#i 2]    // переместит курсор на найденные точки
 
        wait 2000                  // ждать 2 секунды
 
    end_for 
 
end_if   
 
End_script
 
 
// Пример 7
 
// Использование шага поиска
 
set #a findcolor (100 100 200 200 50 50 (0-16777215) %arr)    // получить цвета в 9 точках, сетка 3*3
 
                                                              // координаты: 100 100, 150 100, 200 100
 
                                                              //            100 150, 150 150, 200 150
 
                                                              //            100 200, 150 200, 200 200
 
save_array %arr C:\SaveColor.txt                              // сохранить массив с найденными координатами в файл 'C:\SaveColor.txt'
 
End_script
 
'''Примеры поиска цвета в перекрытом(не свёрнутом) окне:'''
 
<br>Привязка к окну обязательна. Aero (темы Windows 7) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.
 
<br>Окно может быть перекрыто полностью, частично или вообще не перекрыто. Может находиться за пределами экрана.
 
<br>Иногда требуется указывать родительское окно. В окне пилота есть кнопка 'F', при нажатии открывается окно, в котором отображается что "видит" пилот при поиске (Findcolor, Findimage). Если в окне "чёрный квадрат", значит указано не то окно. В Windows 10 работает не во всех приложениях, может потребоваться установка Aero Glass.
 
// Пример 8
 
set #a findcolor (0 0 1920 1080 1 1 (12146182) %arr workwindow )
 
log #a                // если в логе 0, скорее всего, надо указать родительское окно
 
End_script
 
Учтите, при указании родительского окна в качестве рабочего, клики могут быть со смещением. Используйте поиск окна [[Findwindow]] и [[Поиск пути к дочернему окну]].
 
 
// Пример 9
 
set #handle findwindow (Google)                // поиск окна с именем Google
 
set #a findcolor (100 100 1000 1000  (5482548 ) %arr #handle)
 
log #a                                        // количество найденных цветов
 
if #a > 0                                      // если цвет найден
 
      move %arr [1 1] %arr [1 2]                // переместить курсор на первый найденный цвет
 
end_if       
 
End_script
 
 
// Пример 10
 
set #handle findwindow (lineage2)
 
set #a findcolor (18 17  243 37 1 1 (23176) %arr #handle)
 
log #a                // количество найденных цветов       
 
End_script
 
  
 
== Смотрите также ==
 
== Смотрите также ==

Текущая версия на 07:56, 23 августа 2023

Описание

findcolor - ищет пиксели определённого цвета(-ов) в заданной прямоугольной области.

Синтаксис

Привязка к окну: опционально.
Работа со свернутым окном: Нет.
Работа с перекрытым окном: Да. Привязка к окну обязательна.

 a = findcolor (StartX, StartY, EndX, EndY, ShiftX, ShiftY, [[('RequiredColor')]], '%ResultArray' [, type [, count [, deviation]]] [, 'abs'])

где:
<a> - переменная, в которую записывается количество найденных пикселей (или код ошибки меньший нуля)
<StartX StartY> - координаты левого верхнего угла области поиска
<EndX EndY> - координаты правого нижнего угла области поиска
<ShiftX ShiftY> - шаг поиска по осям X и Y соответственно. Почти всегда указывают равным "1".
<'(RequiredColor)'> - один или несколько цветов для поиска (в круглых скобках!). Могут указываться отдельные RGB каналы и/или цвета в виде значений и/или диапазонов:

'(84235)' - точный десятичный цвет
'(84235-86027)' - диапазон десятичных цветов
'(R(11))' - значение красного канала = 11, остальные каналы не проверяются
'(G(73-80))' - диапазон значений зеленого канала, остальные каналы не проверяются
'(R(11)+G(73-80)+B(1))' - заданы значения по всем каналам
'(84235, R(0), R(11)+G(73-80)+B(1))' - комбинированное указание искомых цветов

Если в команде указывается только один десятичный цвет, то его (цвет) можно записывать без круглых скобок.
<'%ResultArray'> - массив, в который записываются найденные значения. В каждую строку записываются координаты найденного пикселя. В 1-й колонке координата X, во 2-й координата Y, в третьей найденный цвет.
[type] (необязательно) - тип поиска. Может принимать значения "1" (надежный), "2" (быстрый) или целое число означающее хендл окна, в котором нужно вести поиск. Как правило, чаще используют "2", он тоже отлично работает.
Если вместо "2" или "1" указать "workwindow" (переменная содержащая хендл рабочего окна), то поиск будет происходить в привязанном рабочем окне (и в его относительных координатах). По сути, это третий тип поиска. При этом окно может быть частично или полностью закрыто другими окнами (но не свёрнуто!).
[count] (необязательно)- количество найденных пикселей, после которых поиск прерывается. Если просто нужно определить наличие цвета в заданной области и не важно общее число таких пикселей, то можно указать "1" - и скорость работы команды будет оптимальной. Если параметр не указывать, то будет искаться максимальное число пикселей
[deviation] (необязательно) - погрешность оттенка. Указывается в %. Например: есть погрешность 3%. Точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.
['abs'] (необязательно) - этот параметр указывается, если вы ищете пиксели в координатах относительно верхнего левого угла экрана. Если не указывать параметр, то поиск будет идти в координатах рабочего окна текущего скрипта.

Коды ошибок findcolor:
'-1' упало при поиске, точная причина не известна
'-2' не нашли открывающую скобку после имени функции
'-3' (не используется)
'-4' неправильно указан тип поиска, или хэндл = 0
'-5' (не используется)
'-6' ошибка получения изображения с экрана.

Иногда требуется сделать клик со смещением. Указывать можно как вначале скрипта, так и перед функцией findColor.

findoffsetx (50)    -- смещение вправо на 50 пикселей
findoffsety (30)    -- смещение вниз на 30 пикселей

findoffsetx (-40)   -- смещение влево на 40 пикселей
findoffsety (-60)   -- смещение вверх на 60 пикселей

Примеры

--lua
-- Пример 1
local a =  findcolor (339, 501, 341, 631, 1, 1, [[('207')]], '%close', 2) -- поиск в рабочем окне
log(#close) -- вывести в лог длину массива close
--lua
-- Пример 2
-- Использование отклонения цвета - deviation
local c = findcolor (0, 0, 100, 100, 1, 1, [[('207')]], '%arr', 2, 10, 3)  -- 2 - это тип поиска
                                                                           -- 10 - количество найденных пикселей
                                                                           -- 3 - погрешность оттенка

if c then -- если найден нужный цвет
 move (arr[1][1], arr[1][2]) -- переместить курсор мыши
 log ('Пикселей найдено -> ' .. c .. '\nКоординаты X -> ' .. arr[1][1] .. '\nКоординаты Y -> ' .. arr[1][2] )
end

Этот пример означает следующее: в текущем рабочем окне в области с координатами (339,501)-(341,631) с шагом поиска (1,1) ищутся все пиксели с десятичным цветом 207. Все найденные координаты пикселей будут записаны в массив close. Тип поиска = 2 (быстрый).
В результате работы, если в данной области будет обнаружено 2 пикселя с цветом 207, то в элемент массива close[1][1] будет записано значение координаты X для первого пикселя, в close[1][2] будет записано значение координаты Y для первого пикселя, в close[2][1] - значение X для второго пикселя, в close[2][2] - значение Y для второго пикселя,
В a будет записано число найденных пикселей = 2 (или 0, если бы такие пиксели не были найдены).

Смотрите также

Findimage (Lua)
Color (Lua)