Screen Colors Scanner (cscan.exe)- аналог findcolor (в UOPilot).
Внимание! Начиная с версии UOPilot 2.21.1 почти все возможности ScreenScanner реализованы в обновленных функциях пилота findcolor и findimage. Поэтому рекомендуется пользоваться стандартными функциями! сайтСкачать с iFolderДля работы требуется установленная на компьютере библиотека Microsoft .Net Framework 3.5 (ссылки есть на странице загрузки программы).
Программа командной строки (нет окна, нет консоли) ищет на экране пиксели цветов в указанных диапазонах или получает другую информацию и помещает результаты поиска в массив %arr и переменные #a, $a используя файл или буфер обмена для обмена данными со скриптом.Гораздо стабильнее программа работает используя файл чем буфер обмена, т.к. часто некоторые программы (PuntoSwitcher, браузеры) используют буфер в своих целях.
Для ускорения работы можно в памяти компьютера создать дополнительный виртуальный жесткий диск, т.н.
RAMDisk. И уже на этом диске размещать файл для вывода результатов работы. Мне понравилась
эта программаЕсли вы всё же решили использовать для передачи данных буфер обмена, то отключайте программы мешающие cscan поместить результат в буфер! (Например, PuntoSwitcher)
Поскольку работа через буфер не всегда стабильна, то возможно в следующих версиях программы эта возможность будет отключена.
Плюсы и минусы по сравнению с findcolor:Минусы:- внешняя утилита, а значит не встроена в сам пилот и обмен данными со скриптом происходит не совсем естественным образом (через файл или буфер обмена);
- приходится искусственно задерживать ход выполнения скрипта пока не будут получены данные от программы- см. пример скрипта в конце сообщения (в findcolor скрипт сам "притормаживает" в строке поиска).
Плюсы:- любые параметры - границы области поиска, шаг поиска. цвета поиска и т.д. можно задавать в виде переменных;
- можно искать прямоугольные изображения из указанных графических файлов;
- можно производить поиск как до первой подходящей точки (ускорение работы), так и до любого указанного количества (параметр -plimit);
- можно указывать один или несколько цветов для поиска через запятую;
- можно указывать цветовые диапазоны для поиска;
- можно указывать отдельные значения и диапазоны цветовых RGB-каналов для поиска;
- можно комбинировать все вышеперечисленные методы поиска через запятую;
- возвращаются координаты найденных точек без всяких дополнительных смещений (как есть);
- можно вместо координат и цветов точек просто получить количество подходящих пикселов (параметр -pcount);
- можно искать координаты области, ограничивающей все пиксели всех указанных цветов (параметр -crop);
- можно изменять шаг поиска по осям X и Y, что реально ускоряет поиск (параметры -dx, -dy) (как и в findcolor);
- можно изменять порядок проверки пикселей по осям X и Y (указывая -dx или -dy меньше нуля);
- можно опускать ненужные параметры - программа примет значения по умолчанию;
- можно менять параметры местами (хотя кому это надо? =)
Программе для работы нужна библиотека Microsoft .Net Framework 3.5! Если у вас она еще не установлена - скачать можно
здесь:
Использование: cscan.exe [<x1> <y1> <x2> <y2> <dx> <dy>] [-pixelscount|-pc <pixelscount>]|[-crop] [-hwindow|-hw <header>] [-NoActivate] -c(<Colors>)|-img (<imagefile>) [-file|-f (<filename>)]
Если задан необязательный параметр
-file (-f), то программа будет сохранять результаты в указанный файл, а не через буфер обмена. Имя файла обязательно указывается внутри круглых скобок. Я очень рекомендую использовать эту опцию, т.к. программа будет работать намного стабильнее, чем при использовании буфера обмена.
Пример:
cscan.exe -x1=10 -y1=20 -x2=1000 -y2=600 -dx=1 -dy=1 -c=(255) -f=( d:\1.txt )
-x1, -y1 - координаты левого верхнего угла области на экране, где искать (=0, если не заданы).
-x2, -y2 - координаты правого нижнего угла области на экране, где искать (= правой и нижней границе экрана, если не заданы)
Если координаты области поиска не указаны, то проверяется весь экран.
-dx, -dy - шаг поиска (=1 по умолчанию)
Пример:
cscan.exe -x1=10 -y1=20 -x2=1000 -y2=600 -dx=1 -dy=1 -c=(255)
Кстати, префиксы параметров -x1, -y1, -x2, -y2, -dx, -dy можно не писать, если значения параметров следуют строго по порядку друг за другом
Пример:
cscan.exe 10 20 1000 600 1 1 -c=(255)
cscan.exe 10 20 1000 600 -c=(255)
cscan.exe -x2=1000 -y2=600 -c=(255) - здесь x1 и y1 равны 0 по умолчанию
Вместо координаты правого нижнего угла с параметрами -x2 -y2 можно задать ширину и высоту области поиска с помощью параметров
-w -hПример:
cscan.exe 10 20 -w=500 -h=5 -c=(255)
В параметре
-hw (-hwindow) можно задать десятичный handle окна, в котором будет производиться поиск (т.н. "поиск в относительных координатах").
Например:
Код
move 600, 500 abs // перемещаем мышку в указанную точку на экране
set #handle windowfromcursor // получаем handle окна под курсором мыши
set workwindow #handle // привязываем пилот к указанному окну (если нужно)
set #lifeLiveC 204 // задаем цвет для поиска
// выполняем поиск в заданной области окна указанного с помощью #handle
set $cscanparam 270, 40 -w=100 -h=300 -hw= #handle -c( #lifeLiveC )
gosub cscan
if #a > 0
set #persLifeX %arr [1 1] // начало полоски жизни перса
set #lifeY %arr [1 2] // полоска жизни
msg Координаты полоски жизни в окне: #persLifeX #lifeY
else
msg Ошибка! не найдена полоска жизни перса!
stop_script
end_if
-plimit или
-pl - число найденных пикселей, после которых поиск прерывается (= 1 по умолчанию; если нужны все пиксели, то ставьте = 0)
Пример:
cscan.exe 10 20 -w=500 -h=5 -c=(255) - вернет только первый подходящий пиксель
cscan.exe 10 20 -w=500 -h=5 -pl=0 -c=(255) - вернет все подходящие пиксели
cscan.exe 10 20 -w=500 -h=5 -pl=2 -c=(255) - вернет первые 2 подходящих пикселя
-pcount или
-pc - если указан этот параметр, то считается число подходящих пикселей, а координаты точек и их цвета не возвращаются (по умолчанию отключен). Число найденных пикселей возвращается в переменных #a и $a. Если число пикселей для поиска не задано, то ищутся все подходящие по цвету (с версии 1.3.0).
Пример:
cscan.exe -pc -c=(255) - вернет число пикселей красного цвета (цвет = 255) на всём экране
Знаки 'равно', 'запятая', 'пробел' считаются равнозначными разделителями, поэтому их можно ставить там где вам удобно для читабельности текста
Примеры: cscan.exe 10 20 1000 600 1 1 -pc=0 -c=(255)
cscan.exe -x1=10 -y1=20 -x2=1000 -y2=600 -dx=1 -dy=1 -c=(255)
cscan.exe -x1 10 -y1 20 -x2 1000 -y2 600 -dx 1 -dy 1 -c=(100, 200-300, R(255), R(90-100)+G(0-10)+B(250-255))
cscan.exe -c (6437673)
(<Colors>) (всегда в круглых скобках!) могут быть:
один или больше цветов:
100, 200, 300
один или больше диапазонов цветов:
100-200, 1100-2000
RGB цвета заданные отдельными каналами. Канал может быть задан одним значением или одним диапазоном.
G(255) (ищутся пиксели у которых значение канала Green равно 255. Значения каналов Red и Blue не проверяются).
R(200-255)+B(0) (ищутся пиксели у которых значение канала Red находится в диапазоне (200-255) и в то же время значение канала Blue равно 0. Значение канала Green не проверяется).
сложный вариант указания цветов:
100, 200-300, R(255), R(90-100)+G(0-10)+B(250-255)
Результаты работы программы в буфере обмена (между значениями символ табуляции):
<x1> <y1> <десятичный цвет1>
<x2> <y2> <десятичный цвет2>
endcscan
...
Если подходящих пикселей не найдено, то результат будет (через табуляцию):
-1000 -1000 -1000
endcscan
Если просто искали пиксели по цвету и их нашлось 12 штук, то результат будет (через табуляцию):
12 -2000 -2000
endcscan
Параметр
-crop используется, если нужно найти координаты области, которая ограничивает все пиксели указанных цветов. Если параметр -plimit не задан, то учитываются все пиксели всех указанных цветов.
261, 736 287, 747 -c( b(100-255)+r(0-80), 240, b(90) ) -f( d:\1.txt ) -crop
Результат: левый верхний и правый нижний углы ограничивающей области и код-признак результата (-3110 левый верхний угол найденной области, -3120 правый нижний угол):
268 739 -3110
280 745 -3120
endcscan
Если указан параметр
-img (имя_графического_файла), то вместо поиска цветов будет выполнен поиск прямоугольного изображения, находящегося в указанном графическом файле. Имя файла обязательно указывать в круглых скобках. Поддерживаются только раширения bmp и png (форматы без потери качества). Значение шага dx и dy в данном случае игнорируется (автоматически устанавливается в 1. Поиск производится в указанной области экрана или окна сверху-вниз, слева-направо).
Пример:
Код
// выполняем поиск на всем экране (по умолчанию)
set $cscanparam -img=( g:\molnija.png )
gosub cscan
if #a > 0
msg Заклинание Молния в координатах: %arr [1 1] , %arr [1 2] . Цвет: %arr [1 3]
else
msg Заклинание Молния не найдено!
end_if
Результат будет содержать координату пикселя левого верхнего угла найденного изображения и цвет этого пикселя.
333 598 4608127
endcscan
Если изображение не найдено, то как и в случае с поиском цветов результат будет
-1000 -1000 -1000
endcscan
Советую изображение для поиска создавать таким образом, чтобы цвет пикселя его левого верхнего угла встречался на экране игры как можно реже (был не белым, не черным и т.п.)
-na (-NoActivate) используется, если не нужно активизировать окно заданное хендлом при снятии цвета. Если указанное окно закрыто другими окнами, то результат поиска будет неверным. Используйте этот параметр на своё усмотрение. По умолчанию он отключен.
Принцип работы:С экрана делается снимок указанной области.
Программа ищет на этом снимке пиксели по первому условию поиска цвета. если цвет не найден, то программа ищет в этой области по второму условию и т.д. То есть условия поиска цвета желательно указывать в порядке убывания вероятности их появления на экране.
Если по окончанию проверки первого условия цвета был найдены подходящие пиксели (хотя бы один), то остальные условия уже не проверяются. При подсчете общего числа пикселей или определении ограничивающей области пиксели считаются по всем заданным цветам.
Если dx>=0, то программа проходит пиксели слева направо, иначе - справа налево.
Если dy>=0, то программа проходит по строкам сверху вниз, иначе - снизу вверх.
В любом случае программа проходит по пикселам одной строки, а затем переходит к другой.
Условия влияющие на скорость поиска:- чем меньше область поиска, тем быстрее
- чем больше шаг (dx, dy), тем быстрее
- чем меньше подходящих пикселей нужно найти, тем быстрее (1 пиксель по умолчанию)
- проверка по условиям в порядке убывания скорости: точный десятичный цвет -> диапазон десятичных цветов -> поиск в RGB цветах -> два точных десятичных цвета -> два диапазона десятичных цветов -> и т.д.
Использование в скрипте Пилота:Код
// в теле скрипта
set #mycolor 204
set $cscanparam 10 10 1000 150 -c( #mycolor )
gosub cscan
if #a > 0
msg Полоска жизни перса начинается в координате %arr [1 1] %arr [1 2]
else
msg Ошибка! не найдена полоска жизни перса!
stop_script
end_if
В конце скрипта, в области процедур:
Процедура использующая файл в качестве среды обмена - РЕКОМЕНДОВАНО
Код
// Вызов внешней программы поиска цвета CScan- аналога findcolor
// Процедура возвращает в переменных #a и $a число найденных пикселей
// Если поиск выполнялся в режиме возврата координат и #a > 0, то в массиве %arr
// возвращаются координаты и цвета найденных пикселей (каждый пиксель в отдельной строчке)
// Содержимое %arr:
// x1 y1 color1
// x2 y2 color2
// ...
// endcscan
// Программа записывает промежуточные результаты в файл, указанный в параметре -file
:cscan
set linedelay 10 // устанавливаем задержку между строк скрипта
// запускаем поиск цветов в указанной области
set $a findcolor ( 0, 0 1, 1 1 1 88888888 %arr 2) // обнуляем массив %arr
exec g:\cscan $cscanparam -file= (g:\1.txt)
:waiting2
wait 200 // небольшая задержка...
// считываем значения в массив
load_array %arr g:\1.txt
set #wcscan size ( %arr ) // число строк в файле
if #wcscan < 2
goto waiting2
end_if
set $a %arr [#wcscan 1] // сохраняем последнее (контрольное) значение
if ( $a <> endcscan ) // последнее контрольное значение должно быть равно endcscan
goto waiting2
end_if
set #dcscan #wcscan - 1
set #zcscan %arr [#dcscan 3 ] // последнее число - цвет или если меньше нуля, то признак результата
set #a 0
if #zcscan <> -1000 // если что-то найдено...
if #zcscan = -2000 // общее число найденных пикселей, без координат
set #a %arr [1 1]
else
set #a #dcscan // число строк координат с цветами
end_if
end_if
set $a #a
return // cscan
Процедура, использующая буфер обмена - не рекомендуется!
Код
// Вызов внешней программы поиска цвета CScan- аналога findcolor
// Если программа глючит/вылетает с ошибкой - отключите программы следящие за буфером обмена (Punto Switcher, например)
// Процедура возвращает в переменных #a и $a число найденных пикселей
// Если поиск выполнялся в режиме возврата координат и #a > 0, то в массиве %arr в одной строке
// возвращаются координаты и цвета найденных пикселей:
// Содержимое %arr: x1 y1 color1 x2 y2 color2 .... endcscan
:cscan
set linedelay 10 // устанавливаем задержку между строк скрипта
// записываем для контроля в буфер обмена слово test
set clipboard test
set $a findcolor ( 0, 0 0, 0 1 1 88888888 %arr 2) // сбрасываем значение массива %arr
// запускаем поиск цветов в указанной области
exec d:\cscan $cscanparam
:waiting1
// считываем из буфера обмена значения в массив
get clipboard %arr
set #wcscan size (%arr [ 1 ]) - 1 // реальное число столбцов
if #wcscan < 1
goto waiting1
end_if
set $a %arr [1 #wcscan] // сохраняем последнее (непустое) значение
if ( $a <> endcscan ) // последнее значение должно быть равно endcscan
goto waiting1
end_if
set #dcscan #wcscan - 1
set #zcscan %arr [1 #dcscan ] // последнее число - цвет или если меньше нуля, то признак результата
set #a 0
if #zcscan >= 0 // указан цвет, значит есть список точек
set #a #wcscan / 3 // число найденных пикселов
else
if #zcscan = -1000 // точки не найдены
set #a 0
else
if #zcscan = -2000 // число найденных пикселей (только подсчет, без координат)
set #a %arr [1 1]
else
set #a #wcscan
end_if
end_if
end_if
set $a #a
return // cscan