Здравствуйте, гость ( Вход | Регистрация )

> Screen Scanner, аналог findcolor и findimage
Zeleax
сообщение 2.5.2011, 14:55
Сообщение #1


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



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



--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 9.6.2011, 18:07
Сообщение #2


***********

Модератор UOPilot
Сообщений: 9.742
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 29646
Пользователь №: 11.279



Как виндой создать рам диск? У нее что-то встроенное есть, даже когда-то юзал, но задолбался уже искать(


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Zeleax
сообщение 10.6.2011, 0:04
Сообщение #3


*********

ex-Moderator UOPilot
Сообщений: 2.440
Регистрация: 8.10.2010
Группа: Пользователи
Наличность: 0
Из: Киев
Пользователь №: 13.093



Цитата(DarkMaster @ 9.6.2011, 18:07) *

Как виндой создать рам диск? У нее что-то встроенное есть, даже когда-то юзал, но задолбался уже искать(

Дак вот же ссылка на нормальную бесплатную программу (у меня такая установлена). Я ж писАл в 1-м посте

Цитата
у меня не создает ни в буфере, ни на D, ни других дисках. Но на диске D всегда после запуска скрипта создается файл 1.txt и в нем
261 736 -3110
287 747 -3120
endcscan
Почему 1.txt, а не arr1test.txt?

Ммммм... Наконец-то появился настоящий тестер! )
Ну ошибся я чуток с версией выложенной программы. Это была тестовая версия с жестко зашитыми параметрами ))
Обновил на сайте до 1.3.1.

Если что не так- пишите!


--------------------
Полезные советы - читать всем! UOWiki
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Сообщений в этой теме
Zeleax   Screen Scanner   2.5.2011, 14:55
DarkMaster   Может пригодиться вот такая заначка: set linedela...   2.5.2011, 19:14
Zeleax   А для cscan числа сразу указываются в UOPilot форм...   2.5.2011, 19:21
DarkMaster   Ну я для диапазонов когда-то давно и делал(точнее ...   2.5.2011, 19:51
Zeleax   Ну я для диапазонов когда-то давно и делал(точнее...   2.5.2011, 20:55
Zeleax   Обновил до 1.0.1 - изменил вывод результатов, если...   2.5.2011, 23:15
DarkMaster   Ты меня не понял. Я имел ввиду, что числами типа ...   3.5.2011, 6:10
Zeleax   Ты меня не понял. Я имел ввиду, что числами типа ...   3.5.2011, 9:33
Zeleax   DarkMaster чего то глючит работа с буфером обмена....   3.5.2011, 11:54
Zeleax   cscan 1.0.4 - исправлена ошибка с указанием област...   3.5.2011, 11:31
DarkMaster   А глючит на каком этапе? Винда не дает твоей проге...   3.5.2011, 11:56
Zeleax   Иногда винда не дает (вроде), но чаще пилот не мож...   3.5.2011, 12:03
Zeleax   Вобщем выложил версию 1.0.7 Вроде бы достаточно ст...   3.5.2011, 12:58
DarkMaster   я сейчас с вражеского ноута, к тому же тут вин7, к...   3.5.2011, 13:31
Zeleax   DarkMaster надо будет подумать... Просто не хотел...   3.5.2011, 14:47
DarkMaster   не спорю не самый легко воспринимаемый вариант пре...   3.5.2011, 15:32
Zeleax   Флаг штука хорошая, но пока не спасает... Проковыр...   3.5.2011, 17:11
Zeleax   cscan 1.0.8 Уже почти замечательно ) Оказывается P...   4.5.2011, 17:42
_LESTAT_   Давно я не заходил сюды, и вот увидел сиё чудо, чт...   6.5.2011, 5:20
DarkMaster   Не так давно была написана еще одна прога, которая...   6.5.2011, 7:17
_LESTAT_   Не так давно была написана еще одна прога, котора...   8.5.2011, 8:29
Zeleax   cscan 1.0.9 В параметре -hw (-hwindow) теперь мож...   8.5.2011, 13:48
DarkMaster   Для этого можно использовать: exec start програ п...   8.5.2011, 15:36
Zeleax   cscan 1.1.0 1) Если задан необязательный параметр...   8.5.2011, 20:32
Zeleax   1) Добавил одну строку (wait 100) в процедуру рабо...   8.5.2011, 23:05
Zeleax   cscan 1.2.0 Добавлен параметр -img для поиска целы...   9.5.2011, 12:59
Zeleax   CScan v.1.3.0 Добавил параметр -crop Используется...   1.6.2011, 13:00
Zeleax   Исправил процедуру в конце 1-го поста, чтоб правил...   4.6.2011, 0:21
avgur   Ищу цвет иконки с бафов в окне игры. Окно растянут...   9.6.2011, 15:15
Zeleax   По идее даже если цвет не найден, то cscan.exe до...   9.6.2011, 17:50
avgur   Ммммм... Наконец-то появился настоящий тестер...   10.6.2011, 14:19
Zeleax   Погонял вот этот код. Привязка скрипта идет к окн...   10.6.2011, 23:38
avgur   у меня не создает ни в буфере, ни на D, ни других ...   9.6.2011, 18:13
DarkMaster   Zeleax я видел. Чесна) Но хотелось бы обойтись без...   10.6.2011, 0:23
Zeleax   Zeleax я видел. Чесна) Но хотелось бы обойтись бе...   10.6.2011, 0:31
avgur   findcolor у меня находит тоже что я задаю по Ctrl+...   11.6.2011, 1:12
Zeleax   Я подозреваю, что это смещение на ширину рамки окн...   11.6.2011, 7:07
avgur   Мне тоже кажется что это смещение на ширину рамки,...   11.6.2011, 13:28
Zeleax   cscan 1.3.3 Исправил неверное определение координ...   13.6.2011, 14:31
avgur   Спасибо за труд, теперь у меня относительные коорд...   13.6.2011, 16:02
Zeleax   Спасибо за добрые слова, приятно, что труд полезе...   13.6.2011, 22:14
Zeleax   [b]cscan 1.3.4 Добавил параметр [b]-na (-NoActiva...   30.6.2011, 10:16
Zeleax   Обновил на сайте файл Dec2RGB_xls.zip - Таблица Ex...   30.6.2011, 15:58
Zeleax   cscan 1.3.5 Исправил баг с неопределявшимся число...   17.7.2011, 19:55
Denker   Здравствуйте. Очень нравится ваша прога, пользуюсь...   15.8.2011, 15:37
Zeleax   можно уменьшить вероятность возникновения ошибки у...   15.8.2011, 17:29
Denker   Спасибо. Задержку увеличивал вплоть до 500, но тут...   15.8.2011, 19:52
Zeleax   когда screenscanner завершает работу , то в файле ...   15.8.2011, 21:19
Denker   когда screenscanner завершает работу , то в файле...   16.8.2011, 8:48
Zeleax   Похоже в новой версии пилота (2.20, 2.21) образова...   16.8.2011, 10:39
SkifF   Доброй ночи, хочу спросить не появлялось ли мысли ...   14.11.2011, 0:01
DarkMaster   Вряд ли это будет сделано. Финдколор и финдимидж п...   14.11.2011, 4:33
Zeleax   Вряд ли это будет сделано. Финдколор и финдимидж ...   14.11.2011, 8:37
SkifF   Ну я пока забросил игру в которую играл в 6 окон с...   14.11.2011, 22:18
Zeleax   команда пилота findimage почти полностью заменяет...   3.1.2012, 8:25


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 6.7.2025, 0:22
Designed by Nickostyle