Findimage (Lua)
Содержание
Описание
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