Разница между страницами «Findimage» и «Findimage (Lua)»

Материал из UoPilot
(Различия между страницами)
Перейти к навигации Перейти к поиску
(Новая страница: « == Описание == '''FindImage''' - оператор поиска сохраненного изображения в области заданной нач...»)
 
(Новая страница: «== Описание == '''findimage''' - поиск изображения в области заданной начальными и конечными коор...»)
 
Строка 1: Строка 1:
 
 
== Описание ==
 
== Описание ==
'''FindImage''' - оператор поиска сохраненного изображения в области заданной начальными и конечными координатами по оси XY.
+
'''findimage''' - поиск изображения в области заданной начальными и конечными координатами по оси XY.  
 
<br>
 
<br>
 
<br>Формат картинки должен быть: '''bmp 24 бита.''' <br>Цвет крайнего пикселя в левом верхнем углу изображения считается "цветом фона", и при поиске картинки на экране не учитывается. Например, цвет этого пикселя красный (255). В этом случае все пиксели красного цвета присутствующие на искомой картинке будут считаться фоновыми (прозрачными) и не будут сравниваться с тем, что присутствует на экране. Поэтому, нельзя чтобы в файле-картинке все пиксели были одного цвета. Нужно сделать, чтобы хотя бы один левый верхний пиксель цветом отличался от остальных.
 
<br>Формат картинки должен быть: '''bmp 24 бита.''' <br>Цвет крайнего пикселя в левом верхнем углу изображения считается "цветом фона", и при поиске картинки на экране не учитывается. Например, цвет этого пикселя красный (255). В этом случае все пиксели красного цвета присутствующие на искомой картинке будут считаться фоновыми (прозрачными) и не будут сравниваться с тем, что присутствует на экране. Поэтому, нельзя чтобы в файле-картинке все пиксели были одного цвета. Нужно сделать, чтобы хотя бы один левый верхний пиксель цветом отличался от остальных.
Строка 9: Строка 8:
 
Привязка к окну: опционально.
 
Привязка к окну: опционально.
 
<br>Работа со свернутым окном: нет.
 
<br>Работа со свернутым окном: нет.
<br>Работа с перекрытым окном: Да. Привязка к окну обязательна. Aero (темы Windows) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.
+
<br>Работа с перекрытым окном: Да. Привязка к окну обязательна. Aero (темы Windows, кроме Windows 10, в котором нет aero) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.
  set #a FindImage (#StartX #StartY #EndX #EndY ($filename) %ResultArray [#type [#accuracy [#count [#deviation]]]] [abs])
+
  ResultArray, a = findimage (<StartX>, <StartY>, <EndX>, <EndY>, <{filename}>  [, type [, accuracy [, count [, deviation]]]] [, abs])
 
Где:
 
Где:
<br>'''<#a>''' - переменная, в которую записывается результат работы команды findimage:
+
<br>'''ResultArray''' - результирующий массив, в который записываются координаты изображения. Координатами изображения считается пиксель левого верхнего угла изображения. Если найдено несколько изображений, то координаты всех найденных изображений. Каждая строка массива хранится данные по отдельному найденному изображению: в первой колонке- координата X, во второй колонке- координата Y.
<br>Если #a = 0, значит поиск был произведён, но картинка не найдена.
+
<br>'''<a>''' - переменная, в которую записывается результат работы команды findimage:
 +
<br>Если a = 0, значит поиск был произведён, но картинка не найдена.
 
<br>Если найдена только 1 картинка, то будет записан процент точности найденного изображения.
 
<br>Если найдена только 1 картинка, то будет записан процент точности найденного изображения.
 
<br>Если найдено несколько картинок, то будет записано количество найденных изображений.
 
<br>Если найдено несколько картинок, то будет записано количество найденных изображений.
<br>Однозначно определить сколько именно картинок было найдено командой FindImage лучше всего по размеру массива %ResultArray с помощью функции Size(%ResultArray).
+
<br>Однозначно определить сколько именно картинок было найдено командой FindImage лучше всего по размеру массива ResultArray с помощью функции #ResultArray.
<br>#a < 0 означает, что FindImage не смог произвести поиск- либо была обнаружена ошибка в написании параметров команды, либо проблемы с самим файлом картинки.
+
<br>a < 0 означает, что FindImage не смог произвести поиск- либо была обнаружена ошибка в написании параметров команды, либо проблемы с самим файлом картинки.
<br>Если #a = -4, значит файл картинки не найден / в неправильном формате / повреждён / все пиксели файла одного цвета. Чаще всего- путь к файлу указан неправильно.
+
<br>Если a = -4, значит файл картинки не найден / в неправильном формате / повреждён / все пиксели файла одного цвета. Чаще всего- путь к файлу указан неправильно.
<br>'''<#StartX #StartY>''' - координаты левого верхнего угла области поиска.
+
<br>'''StartX, StartY''' - координаты левого верхнего угла области поиска.
<br>'''<#EndX #EndY>''' - координаты правого нижнего угла области поиска.
+
<br>'''EndX, EndY''' - координаты правого нижнего угла области поиска.
<br>'''<($filename)>''' - путь к сохранённому изображению (только файл формата bmp). Путь к изображению может быть указан как '''абсолютный''' - (C:\programms\pilot\images\), так '''и относительный''' - (images\). Указывается в круглых скобках. При использовании пробелов в адресе используйте кавычки либо строковую переменную(например $myPatch), предварительно присвоив ей(переменной) необходимый адрес.
+
<br>'''{filename}''' - путь к сохранённому изображению (только файл формата bmp 24 бита). Путь к изображению может быть указан как '''абсолютный''' - {C:\\programms\\pilot\\images\\}, так '''и относительный''' - {images\\}. Указывается в фигурных скобках.
<br>'''<%ResultArray>''' - результирующий массив, в который записываются координаты изображения. Координатами изображения считается пиксель левого верхнего угла изображения. Если найдено несколько изображений, то координаты всех найденных изображений. Каждая строка массива хранится данные по отдельному найденному изображению: в первой колонке- координата X, во второй колонке- координата Y.
+
<br>'''type''' - тип поиска. Может принимать значения: '''1''' (надежный), '''2''' (быстрый), '''workwindow'''(поиск в окне, в том числе перекрытом). Настоятельно рекомендуется использовать быстрый способ поиска, кроме случаев с некорректным обнаружением изображения. По умолчанию 2й тип поиска. Тип workwindow - в качестве аргумента указывать хендл окна.
<br>'''[#type]''' - тип поиска. Может принимать значения: '''1''' (надежный), '''2''' (быстрый). Настоятельно рекомендуется использовать быстрый способ поиска, кроме случаев с некорректным обнаружением изображения. По умолчанию 2й тип поиска.
+
<br>'''accuracy''' - точность поиска. Указывается в процентах. Используется для отсева изображений не достаточно схожих с оригиналом. По умолчанию значение равно 80%.
<br>'''[#accuracy]''' - точность поиска. Указывается в процентах. Используется для отсева изображений не достаточно схожих с оригиналом. По умолчанию значение равно 80%.
+
<br>'''count''' - ограничение количества найденных изображений. По умолчанию установлено для одного изображения - значение '''1''', для всех возможных - значение '''-1'''.  
<br>'''[#count]''' - ограничение количества найденных изображений. По умолчанию установлено для одного изображения - значение '''1''', для всех возможных - значение '''-1'''.  
+
<br>'''deviation''' - погрешность оттенка. Пример: есть погрешность 3%. Точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.  
<br>'''[#deviation]''' - Погрешность оттенка. Пример: есть погрешность 3%. точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.  
+
<br>'''abs''' - флаг использования абсолютных координат. Если он указан то поиск происходит относительно левого верхнего угла экрана. Без флага поиск происходит относительно левого верхнего угла рабочего окна(привязанного через ctrl+a либо иным способом). Указывается в кавычках "abs".
<br>'''[abs]''' - флаг использования абсолютных координат. Если он указан то поиск происходит относительно левого верхнего угла экрана. Без флага поиск происходит относительно левого верхнего угла рабочего окна(привязанного через ctrl+a либо иным способом).
 
 
<br>
 
<br>
 
<br>Если вы ищете на экране текст в виде картинки, и в системе используется сглаживание шрифтов, то могут быть проблемы с нахождением, даже если вы видите, что такой текст на экране есть. Все-равно при включенном сглаживании искомая картинка может незначительно отличаться от того что есть на экране. В этом случае рекомендуется снизить точность поиска либо отключить сглаживание шрифтов на компьютере, где используется findimage.
 
<br>Если вы ищете на экране текст в виде картинки, и в системе используется сглаживание шрифтов, то могут быть проблемы с нахождением, даже если вы видите, что такой текст на экране есть. Все-равно при включенном сглаживании искомая картинка может незначительно отличаться от того что есть на экране. В этом случае рекомендуется снизить точность поиска либо отключить сглаживание шрифтов на компьютере, где используется findimage.
Строка 39: Строка 38:
 
''''-6'''' ошибка получения изображения с экрана.<br>
 
''''-6'''' ошибка получения изображения с экрана.<br>
 
''''-7'''' нечего искать, искомая картинка пустая.
 
''''-7'''' нечего искать, искомая картинка пустая.
<br><br>Иногда требуется сделать клик не по самому изображению, а со смещением. Указывать можно как вначале скрипта так и перед функцией Findimage.
+
<br><br>Иногда требуется сделать клик не по самому изображению, а со смещением. Указывать можно как вначале скрипта так и перед функцией findimage.
  set findoffsetx 50    //смещение вправо на 50 пикселей
+
  findoffsetx (50)   -- смещение вправо на 50 пикселей
  set findoffsety 30    //смещение вниз на 30 пикселей
+
  findoffsety (30)   -- смещение вниз на 30 пикселей
 
   
 
   
  set findoffsetx -40  //смещение влево на 40 пикселей
+
  findoffsetx (-40)   -- смещение влево на 40 пикселей
  set findoffsety -60  //смещение вверх на 60 пикселей
+
  findoffsety (-60)   -- смещение вверх на 60 пикселей
  
 
== Примеры ==
 
== Примеры ==
// Пример 1
 
// перед запуском скрипта не забываем привязать скрипт к рабочему окну (Ctrl+A)
 
set #startX 100
 
set #startY 120
 
set #endX 300
 
set #endY 540
 
set $path "C:\Program Files\UOPilot\images\"
 
set %cash[1] картинка
 
// будем искать картинку из файла C:\Program Files\UOPilot\images\картинка.bmp
 
set #a findimage (#startX #startY #endX #endY ($path%cash[1].bmp) %crds 2)
 
if #a > 0
 
  msg Изображение найдено в координатах X= %crds[1 1] Y= %crds[1 2]. Кликнем на нём...
 
  left %crds[1 1] %crds[1 2] // кликнули
 
else
 
  msg Изображение не найдено
 
end_if
 
В результате работы, если в заданной области картинка обнаружена, в массив %crds[1 1] будет записано значение координаты X
 
для первой картинки, а в %crds[2 2] - значение Y для второй картинки.
 
// Пример 2
 
//поиск изображений (если будет найдено больше 20 поиск прекратится) с точностью 70% и отклонением в цвете 5%
 
set #check FindImage (#startX #startY #endX #endY (images\step.bmp) %crds 2 70 20 5) 
 
  
  // Пример 3
+
  --lua
  set #b FindImage (10 100 30 150 (d:\myImages\wolf.bmp) %arr 2 80 20 5)
+
local startX, startY, endX, endY = 0, 0, 1920, 1080  -- координаты поиска
 +
local path = <nowiki>[["C:\картинка.bmp"]]</nowiki>                  -- путь к картинке, bmp 24 бита
 +
local arr, a = findimage (startX, startY, endX, endY, {path}, 2)  -- поиск картинки
 +
  hint (a)    -- результат поиска, подсказка в правом нижнем углу
 +
if arr then  -- если найдена
 +
    log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
 +
    kleft (arr[1][1], arr[1][2]) -- кликнули
 +
end
 +
-- в результате работы, если в заданной области картинка обнаружена, в массив %arr[1][1] будет записано значение координаты X
 +
-- а в %arr[1][2] - значение координаты Y
  
  // Пример 4
+
  --lua
  // будем искать картинку из файла картинка2.bmp, находящуюся в папке пилота
+
-- поиск нескольких одинаковых изображений
  set #a findimage (100 120 1024 700 (\картинка2.bmp) %arr 2 80 -1)   
+
  -- если будет найдено больше 20 поиск прекратится, точность 70%, отклонение в цвете 5%
  set #w size (%arr) // получим число найденных картинок
+
  local arr = findimage (0, 0, 1920, 1080, {"картинка.bmp"}, 2, 70, 20, 5-- поиск картинки, должна быть в папке с пилотом
  msg Найдено картинок: #w
+
  hint (a)     -- результат поиска, подсказка в правом нижнем углу
for #i 1 #w
+
  if arr then  -- если найдена
    set #x %arr [#i 1]
+
    log ("Найдено картинок: " .. #arr)
    set #y %arr [#i 2]
+
    for i=1, #arr do
    msg картинка в координатах: #x #y
+
        kleft (arr[i][1], arr[i][2])  -- кликнули на каждой
  end_for
+
        wait (1000)  -- пауза 1000 мсек (1 сек)
 +
    end
 +
  end
  
  // Пример 5
+
  --lua
// поиск нескольких картинок
+
  local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска
// перед запуском скрипта не забываем привязать скрипт к рабочему окну (Ctrl+A)
+
  local path = <nowiki>[[C:\pilot]]</nowiki>                    -- путь к картинкам
  set #startX 0
 
set #startY 0
 
set #endX 1920
 
set #endY 1080
 
  set $path "C:\Program Files\UOPilot\images\"      // путь к картинкам
 
set %image [1] картинка1                          // имя изображения
 
set %image [2] картинка2                          // имя второго изображения
 
set %image [3] картинка3                          // третьего
 
set %image [4] карти                              // имена могут быть любыми
 
 
   
 
   
  set #size size(%image)                            // всего картинок  
+
  local image = {"картинка", "картинка2", "картинка3"}  -- массив с именами картинок, имена могут быть любыми
  hint Всего картинок #size
+
  hint ("Всего картинок для поиска " .. #image)
+
  for i=1, #image do                     -- цикл для поиска картинок
:metka
+
     local arr, a = findimage (startX, startY, endX, endY, {path .. "\\" .. image[i] .. ".bmp"}, 2) -- поиск картинки
  for #i 1 #size 1                     // цикл для поиска картинок
+
     if  arr then
     set #a findimage (#startX #startY #endX #endY ($path%image[#i].bmp) %arr 2)
+
         move (arr[1][1], arr[1][2])    -- переместить курсор на найденную картинку
     if  #a > 0
+
         wait (500)                     -- ждать 0,5 секунды
         move %arr[1 1] %arr[1 2]     // переместить курсор на найденную картинку
+
     end
         wait 500                    // ждать 0,5 секунды
+
  end
     end_if
+
'''Пример поиска картинки в перекрытом(не свёрнутом) окне:'''
end_for
 
wait 3000                            // ждать 3 секунды
 
  goto metka
 
<br>'''Примеры поиска картинки в перекрытом(не свёрнутом) окне:'''
 
 
<br>Привязка к окну обязательна. Aero (темы Windows 7) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.
 
<br>Привязка к окну обязательна. Aero (темы Windows 7) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.
 
<br>Окно может быть перекрыто полностью, частично или вообще не перекрыто. Может находиться за пределами экрана.
 
<br>Окно может быть перекрыто полностью, частично или вообще не перекрыто. Может находиться за пределами экрана.
<br>Иногда требуется указывать родительское окно. В окне пилота есть кнопка 'F', при нажатии открывается окно, в котором отображается что "видит" пилот при поиске (Findcolor, Findimage). Если в окне "чёрный квадрат", значит указано не то окно. В Windows 10 работает не во всех приложениях, может потребоваться установка Aero Glass.
+
<br>Как правило, требуется указывать родительское окно. В окне пилота есть кнопка 'F', при нажатии открывается окно, в котором отображается что "видит" пилот при поиске (Findcolor, Findimage).  
  // Пример 6
+
  --lua
  //Чтобы понять как работает поиск можно попробовать на рабочем столе найти значок 'Мой компьютер'.
+
  local handle = findwindow ("RPG")  -- поиск окна, вместо 'Lineage2' написать нужное имя окна
  //Делаем картинку значка в формате bmp, называем 'мойкомпьютер' (без кавычек), закидываем на диск 'C:'.
+
  local startX, startY, endX, endY = 0, 0, 1920, 1080  -- координаты поиска
//При этом можно перекрыть значок каким-нибудь окном.
+
local path = <nowiki>[["C:\картинка.bmp"]]</nowiki>                    -- путь к картинке
   
+
  if handle then
  //Не забываем сделать привязку Ctrl + A.
+
    local arr, a = findimage (startX, startY, endX, endY, {path}, handle[1][1]) -- поиск картинки
set #a FindImage(0 0 1920 1080 (C:\мойкомпьютер.bmp) %arr workwindow)
+
    hint (a)     -- результат поиска, подсказка в правом нижнем углу
  if #a > 0
+
    if arr then -- если найдена
    log Картинка найдена. Наведём на неё курсор.
+
        log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
    move %arr [1 1] %arr [1 2]
+
        left (arr[1][1], arr[1][2], handle[1][1])  -- кликнули, left работает не во всех приложениях
     End_script
+
        -- move (arr[1][1], arr[1][2], handle[1][1])  -- навести курсор на картинку (раскомментировать строку чтобы сработало)
 +
    else
 +
        log ("Изображение не найдено")
 +
     end
 
  else
 
  else
     msg Картинка не найдена.
+
     log("Окно не найдено")
end_if
+
  end
 
 
// Пример 7
 
//Ищем картинку в окне Yandex, при этом не важно какое указано окно через Ctrl + A или сделано рабочим через 'set workwindow'.
 
set #handle FindWindow(Yandex)              //поиск окна с именем Yandex
 
set #a FindImage(0 0 1920 1080 (C:\UOPilot\images\image.bmp) %arr #handle 80 -1 3)    //поиск изображения
 
hint #a                                    //в правом нижнем углу отображён результат поиска   
 
if #a > 0
 
    move %arr [1 1] %arr [1 2] #handle      //навести курсор на первую найденную картинку
 
                                            //обратите внимание, что в команде 'move' указан хендл окна
 
                                            //т. е. курсор будет перемещён как будто привязка сделана к окну Yandex
 
    End_script
 
  end_if
 
  
 
== Смотрите также ==
 
== Смотрите также ==
  
[[Findcolor]]
+
[[Findcolor (Lua)]]
<br> [[If]]
+
<br>[[Color (Lua)]]
<br>[[Get color]]
 
 
 
== История развития ==
 
 
 
'''2.20'''
 
<br>Добавил команду поиска изображений 'set $a FindImage (StartX StartY EndX EndY (filename) ResultArray [type [accuracy [count]]] [abs])'. Ищет по уникальному для изображения цвету. может ничего не найти, если этот цвет чем-то перекрыт. цвет в левом верхнем углу изображения считается цветом фона, и не анализируется. изображение должно быть 24 бита, bmp. В 'ResultArray' возвращает координаты левого верхнего угла найденых изображений. в строковой переменной возвращает количество найденых изображений, либо процент точности единственного найденного.
 
<br>type:
 
<br>1 - надежный (default)
 
<br>2 - быстрый
 
<br>accuracy: точность поиска в процентах (default: 80)
 
<br>count: максимальное количество найденых изображений (default: 1, all: -1)
 
<br>Коды ошибок:
 
<br>'-1' упало при поиске, точная причина не известна
 
<br>'-2' не нашли открывающую скобку после имени функции
 
<br>'-3' не найдено пути в скобках
 
<br>'-4' ошибка поиска файла
 
<br>'-5' ошибка обработки искомого изображения
 
<br>'-6' ошибка получения изображения с экрана
 
 
 
'''2.21.2'''
 
<br>Исправил ошибку с определением пути к файлу картинки в 'findimage' после сохранении скрипта через пункт меню 'сохранить как'
 
 
 
'''2.23'''
 
<br>Добавил в 'findimage' погрешность оттенка. указывается в %. слегка изменился синтаксис команды:
 
'set $a FindImage (StartX StartY EndX EndY (filename) ResultArray [type [accuracy [count [deviation]]]] [abs])'
 
Пример: есть погрешность 3%. точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.
 
<br>Переделал 'findimage'. повысил стабильность работы. ускорил в ~27 раз при типе поиска 2
 
<br>Исправил вычисление точности найденной картинки в команде 'findimage'
 
 
 
'''2.27'''
 
<br>Научил 'findimage' искать картинки в перекрытых окнах. ищет не на всем экране, а в конкретном указанном окне. хэндл окна указывается в качестве типа поиска
 
set #w findwindow (test.bmp)
 
set $a FindImage ( 0 0 1300 1300 (2.bmp) %a workwindow 70 10 15)
 
set $a FindImage ( 0 0 1300 1300 (2.bmp) %a #w 70 10 15)
 
 
 
'''2.27.1'''
 
<br>Добавил код ошибки -4 с выводом сообщения, что файл не найден в команде 'findimage'.
 
<br>Подправил поиск в перекрытых окнах в командах 'findimage', 'findcolor'.
 
 
 
'''2.31'''
 
<br>Научил 'findimage' понимать координаты, указанные элементами массива.
 
 
 
'''2.32'''
 
<br>Добавил в 'findimage' возврат конечных координат найденной картинки в третьем и четвертом элементе возвращаемого массива.
 
 
 
'''2.33'''
 
<br>Исправил ошибку в 'findimage', когда выводил имя массива вместо количества найденных.
 
<br>Переписал команду 'findimage'. Исправил утечки памяти.
 
 
 
'''2.34'''
 
<br>Исправил 'findimage' и 'findcolor'. Возвращали неправильные координаты по Y. Ищет слева снизу - вправо вверх.
 
 
 
'''2.35'''
 
<br>Перевернул 'findimage'. Теперь снова ищет сверху вниз.
 
<br>Исправил в команде 'findimage' выходом за пределы диапазона поиска в сторону уменьшения.
 
<br>Добавил в 'findimage' возврат конечных координат найденной картинки в третьем и четвертом элементе возвращаемого массива при типе поиска 2.
 
<br>Исправил в 'findimage' возврат конечных координат найденной картинки (не возвращало совсем).
 
<br>Исправил 'findimage' и 'findcolor'. Возвращали неправильные координаты.
 
<br>Сделал по-умолчанию второй тип поиска в команде 'findimage'.
 
 
 
'''2.36'''
 
<br>Добавил переменные смещения кликов мышью и команды 'move', и переменные смещения возвращаемых координат команд 'findimage' и 'findcolor':
 
'clickoffsetx', 'clickoffsety', 'findoffsetx',  'findoffsety'.
 
  //размер картинки 9х9
 
set findoffsetx 5
 
set findoffsety 5
 
set ... findimage
 
  //вернет координаты не левого верхнего угла а центра картинки
 
 
 
set clickoffsetx 5
 
set clickoffsety 5
 
left 0 0
 
  //кликнет в координаты 5, 5
 
Добавил кнопочку "F", открывающую тестовую формочку с изображением, найденным Findimage.
 
 
 
'''2.39'''
 
<br>Исправил ошибку "-4", возникающую, если координата и путь к файлу не разделены пробелом.
 
 
 
'''2.41'''
 
<br>В команду 'findimage' добавил код ошибки '-7' - нечего искать, искомая картинка пустая.
 
[[Категория:Поиск изображений]]
 

Версия 20:53, 27 августа 2019

Описание

findimage - поиск изображения в области заданной начальными и конечными координатами по оси XY. <br> <br>Формат картинки должен быть: bmp 24 бита. <br>Цвет крайнего пикселя в левом верхнем углу изображения считается "цветом фона", и при поиске картинки на экране не учитывается. Например, цвет этого пикселя красный (255). В этом случае все пиксели красного цвета присутствующие на искомой картинке будут считаться фоновыми (прозрачными) и не будут сравниваться с тем, что присутствует на экране. Поэтому, нельзя чтобы в файле-картинке все пиксели были одного цвета. Нужно сделать, чтобы хотя бы один левый верхний пиксель цветом отличался от остальных.

Синтаксис

Привязка к окну: опционально. <br>Работа со свернутым окном: нет. <br>Работа с перекрытым окном: Да. Привязка к окну обязательна. Aero (темы Windows, кроме Windows 10, в котором нет aero) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена.

ResultArray, a = findimage (<StartX>, <StartY>, <EndX>, <EndY>, <{filename}>  [, type [, accuracy [, count [, deviation]]]] [, abs])

Где: <br>ResultArray - результирующий массив, в который записываются координаты изображения. Координатами изображения считается пиксель левого верхнего угла изображения. Если найдено несколько изображений, то координаты всех найденных изображений. Каждая строка массива хранится данные по отдельному найденному изображению: в первой колонке- координата X, во второй колонке- координата Y. <br><a> - переменная, в которую записывается результат работы команды findimage: <br>Если a = 0, значит поиск был произведён, но картинка не найдена. <br>Если найдена только 1 картинка, то будет записан процент точности найденного изображения. <br>Если найдено несколько картинок, то будет записано количество найденных изображений. <br>Однозначно определить сколько именно картинок было найдено командой FindImage лучше всего по размеру массива ResultArray с помощью функции #ResultArray. <br>a < 0 означает, что FindImage не смог произвести поиск- либо была обнаружена ошибка в написании параметров команды, либо проблемы с самим файлом картинки. <br>Если a = -4, значит файл картинки не найден / в неправильном формате / повреждён / все пиксели файла одного цвета. Чаще всего- путь к файлу указан неправильно. <br>StartX, StartY - координаты левого верхнего угла области поиска. <br>EndX, EndY - координаты правого нижнего угла области поиска. <br>{filename} - путь к сохранённому изображению (только файл формата bmp 24 бита). Путь к изображению может быть указан как абсолютный - {C:\\programms\\pilot\\images\\}, так и относительный - {images\\}. Указывается в фигурных скобках. <br>type - тип поиска. Может принимать значения: 1 (надежный), 2 (быстрый), workwindow(поиск в окне, в том числе перекрытом). Настоятельно рекомендуется использовать быстрый способ поиска, кроме случаев с некорректным обнаружением изображения. По умолчанию 2й тип поиска. Тип workwindow - в качестве аргумента указывать хендл окна. <br>accuracy - точность поиска. Указывается в процентах. Используется для отсева изображений не достаточно схожих с оригиналом. По умолчанию значение равно 80%. <br>count - ограничение количества найденных изображений. По умолчанию установлено для одного изображения - значение 1, для всех возможных - значение -1. <br>deviation - погрешность оттенка. Пример: есть погрешность 3%. Точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением. <br>abs - флаг использования абсолютных координат. Если он указан то поиск происходит относительно левого верхнего угла экрана. Без флага поиск происходит относительно левого верхнего угла рабочего окна(привязанного через ctrl+a либо иным способом). Указывается в кавычках "abs". <br> <br>Если вы ищете на экране текст в виде картинки, и в системе используется сглаживание шрифтов, то могут быть проблемы с нахождением, даже если вы видите, что такой текст на экране есть. Все-равно при включенном сглаживании искомая картинка может незначительно отличаться от того что есть на экране. В этом случае рекомендуется снизить точность поиска либо отключить сглаживание шрифтов на компьютере, где используется findimage.

Коды ошибок FindImage:<br> '-1' упало при поиске, точная причина не известна.<br> '-2' не нашли открывающую скобку после имени функции.<br> '-3' не найдено пути в скобках.<br> '-4' ошибка поиска файла.<br> '-5' ошибка обработки искомого изображения.<br> '-6' ошибка получения изображения с экрана.<br> '-7' нечего искать, искомая картинка пустая. <br><br>Иногда требуется сделать клик не по самому изображению, а со смещением. Указывать можно как вначале скрипта так и перед функцией findimage.

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

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

Примеры

--lua
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска 
local path = <nowiki>"C:\картинка.bmp"</nowiki>                   -- путь к картинке, bmp 24 бита
local arr, a = findimage (startX, startY, endX, endY, {path}, 2)  -- поиск картинки
hint (a)     -- результат поиска, подсказка в правом нижнем углу
if arr then  -- если найдена
    log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
    kleft (arr[1][1], arr[1][2])  -- кликнули
end
-- в результате работы, если в заданной области картинка обнаружена, в массив %arr[1][1] будет записано значение координаты X
-- а в %arr[1][2] - значение координаты Y
--lua
-- поиск нескольких одинаковых изображений
-- если будет найдено больше 20 поиск прекратится, точность 70%, отклонение в цвете 5%
local arr = findimage (0, 0, 1920, 1080, {"картинка.bmp"}, 2, 70, 20, 5)  -- поиск картинки, должна быть в папке с пилотом
hint (a)     -- результат поиска, подсказка в правом нижнем углу
if arr then  -- если найдена
    log ("Найдено картинок: " .. #arr)
    for i=1, #arr do
        kleft (arr[i][1], arr[i][2])  -- кликнули на каждой
        wait (1000)  -- пауза 1000 мсек (1 сек)
    end 
end
--lua
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска
local path = <nowiki>C:\pilot</nowiki>                    -- путь к картинкам

local image = {"картинка", "картинка2", "картинка3"}   -- массив с именами картинок, имена могут быть любыми
hint ("Всего картинок для поиска " .. #image)
for i=1, #image do                     -- цикл для поиска картинок
    local arr, a = findimage (startX, startY, endX, endY, {path .. "\\" .. image[i] .. ".bmp"}, 2)  -- поиск картинки
    if  arr then
        move (arr[1][1], arr[1][2])    -- переместить курсор на найденную картинку
        wait (500)                     -- ждать 0,5 секунды
    end
end

Пример поиска картинки в перекрытом(не свёрнутом) окне: <br>Привязка к окну обязательна. Aero (темы Windows 7) должен быть включен. Если был установлен Астер, то он должен быть отключен, а система перезагружена. <br>Окно может быть перекрыто полностью, частично или вообще не перекрыто. Может находиться за пределами экрана. <br>Как правило, требуется указывать родительское окно. В окне пилота есть кнопка 'F', при нажатии открывается окно, в котором отображается что "видит" пилот при поиске (Findcolor, Findimage).

--lua
local handle = findwindow ("RPG")   -- поиск окна, вместо 'Lineage2' написать нужное имя окна
local startX, startY, endX, endY = 0, 0, 1920, 1080   -- координаты поиска
local path = <nowiki>"C:\картинка.bmp"</nowiki>                    -- путь к картинке
if handle then
    local arr, a = findimage (startX, startY, endX, endY, {path}, handle[1][1])  -- поиск картинки
    hint (a)     -- результат поиска, подсказка в правом нижнем углу
    if arr then  -- если найдена
        log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2])
        left (arr[1][1], arr[1][2], handle[1][1])  -- кликнули, left работает не во всех приложениях
        -- move (arr[1][1], arr[1][2], handle[1][1])  -- навести курсор на картинку (раскомментировать строку чтобы сработало)
    else
        log ("Изображение не найдено")
    end
else
    log("Окно не найдено")
end

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

Findcolor (Lua) <br>Color (Lua)