Как создать свой сайт

Сканирование экрана и поиск изображений

Скачать Кибор

О программе Кибор

Описание языка Кибор
Переменные

Операции с переменными
Логика и переходы
Указатели
Функции

Список функций
Индификация окон и контролов

Управление окнами

Клавиатура

Мышь
Контролы
Работа с изображением
Сканирование экрана и поиск изображений
Поиск 3Д моделей в играх
Определение цвета пикселя
Система
Вывод сообщений
Вспомогательные

Интерфейс программы
Текстовый редактор

Контролы управления

Визуальные инструменты Кибор

Шпион получающий информацию о окнах, контролах, координатах мыши и цвете экрана

Сканер графического интерфейса

Демонстрационные примеры
Бот для игры в пасьянс Косынка
Бот для Warspear Online

Список демонстрационных примеров...

Поиск изображений на экране.

При написание скриптов часто возникает необходимость дать знать программе что творится на экране.
 Для этого существует функция findimage. Она сканирует весь  или часть экрана или окна конкретной программы и ищет совпадения с загруженными ранее из .bmp файлов в память программы изображеними. В Windows 7 при глубине цвета 32 findimage работает в перекрытых или сдвинутых за пределы экрана окнах так же.

Синтаксис:
 findimage(-1, #image[0][0], fon_color, #x[0], #y[0], x_start, y_start, x_finish, y_finish, wind);
Первый параметр - если -1  - искать все совпадающие изображения и записывать их в масив. Если не -1   , к примеру 5... искать до 5 включительно совпадений и завершать поиск.
Второй - указатель на масив int в котором хранится искомое изображение.
Третий - фоновый цвет который не учитывается при сравнение изображений. Если указать -1, все цвета учитываются. В виде фонового цвета можно указать цвет конкретного пикселя искомой картинки - image[0][0] (цвет левого верхнего пикселя)... и т.д.
Четвертый и пятый - указатели на одномерные масивы int, в которые будут сохранены координаты найденых в окне изображений.
Шестой и седьмой - стартовые клиентские координаты в окне в котором ищется изображение относительно верхнего левого угла.
Восьмой и девятый - клиентские координаты окончания поиска в окне в котором ищется изображение.
Десятый - указатель на окно в котором ищем изображение. При -1 ищется по всему экрану.

Так же в качестве последнего параметра можно указать указатель на двухмерный массив int в котором хранится изображение.
В этом случае будет искаться в нем.
 findimage(1, #Image[0][0], 16777215, #x[0], #y[0], 0, 140, wind.widthclient, wind.heightclient, #image_skrin[0][0]);

Пример:
//загружаем изображение туза пик сохраненного заранее в файле
int Image[68][92];
loadimage (#Image[0][0], "C:\Image.bmp");
//получаем указатель на окно игры
win wind=window ("Косынка", "Solitaire", -1);
//Сканируем ряд с картами в игре где хотим найти этот туз
int x[1], y[1];//масивы для сохранения координат левых верхних углов найденых в игре тузов пик. так как туз только 1, то масивы имеют размеры 1.
//Ищем одно совпадение не учитывая цвет 16777215, начиная по x 0 y 140, заканчивая на координатах wind.widthclient и wind.heightclient (то есть до правого нижнего угла). При нахождение записываем координаты левого верхнего угла найденого изображения в масивы x и y. Все записываемые координаты расчитываются относительно стартовой точки поиска. То есть найденая картинка находящаяся по клиентским координатам игры 200 200 будет записана как 200 60, так как точка старта 0 140.
findimage(1, #Image[0][0], 16777215, #x[0], #y[0], 0, 140, wind.widthclient, wind.heightclient, wind);

Функция возвращает колическво найденых изображений. Координаты найденых изображений находятся в одномерных масивах int x[50], y[50]; (50 для примера).
В случае ошибка возвращает:
-1 размер масива в который записываются X координаты меньше найденых изабражений
-2 размер масива в который записываются Y координаты меньше найденых изабражений
-3 Область поиска меньше искомого рисунка по X
-4 Область поиска меньше искомого рисунка по Y

Пример демонстрирующий ожидание, поиск и двойной клик по центру найденого туза:

//Получаем указатель на окно игры и устанавливаем новый размер клиента окна, с которым мы работали при создание изображения туза для поиска
win wind=window ("Косынка", "Solitaire", -1);
wind.widthclient=800; wind.heightclient=519; wind.leftclient=16; wind.topclient=59;
moveclient(wind);

//Загружаем изображение туза
int Image[68][92];
loadimage (#Image[0][0], "C:\Image.bmp");

//Ищем туза в цикле пока не появится в ряду среди карт отступая сверху клиентской части игры 140. Что бы не найти туза в верхнем ряду.
int x[1], y[1];
st: if (findimage(1, #Image[0][0], 16777215, #x[0], #y[0], 0, 140, wind.widthclient, wind.heightclient, wind)<1)goto st;
//Двойной клик по центру найденого туза. Координату Y смещаем на 140
mousedbl(LEFT, x[0]+imagewidth(#Image[0][0])/2,  y[0]+imageheight(#Image[0][0])/2+140, 1, wind);

Функцию findimage так же можно использовать для поиска изображений имеющих отклонения цветов от исходного изображения, или по неполному (к примеру частично перекрытому другим изображением). В этом случае findimage принимает 17 параметров:
 findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, 1366, 768, Красный_меньше_на, Красный_больше_на, Зеленый_меньше_на, Зеленый_больше_на, Синий_меньше_на, Синий_больше_на, Процент_совпадений_достаточный_для_идентификации, флаг_не_искать_в_области_где_найдено, -1);

Объяснение:
Каждый цвет состоит из трех основных цветов - Красный(R), Зеленый(G), Синий(B). (R, G, B). Каждый из этих трех цветов обозначается числом от 0 до 255. К примеру цвет (0, 0, 0) будет черный, а (255, 255, 255) белым. (255, 0, 0) красным, а (255, 50, 70) красным с примесью зеленого и синего.

Обозначение параметров:
Красный_меньше_на - тут указываем число НА которое красный компонент может быть меньше того что находится в поиске.
Красный_больше_на - тут указываем число НА которое красный компонент может быть больше того что находится в поиске.
Зеленый_меньше_на, Зеленый_больше_на, Синий_меньше_на, Синий_больше_на аналогично.

Процент_совпадений_достаточный_для_идентификации - процент от общего количества пикселей участвующих в поиске достаточный для того что бы изображение считалось совпавшим. 100 - необходимо что бы все изображение совпало. 20 - достаточно совпадения одной пятой части изображения. Применять для поиска изображений которые могут частично быть перекрыты или часть цвета пикселей может выйти за пределы колебаний описанных вышеприведенными параметрами.

флаг_не_искать_в_области_где_найдено - если 1 больше не искать в областях на экране по размеру искомого рисунка где найден уже рисунок

Пример:
findimage(1, #Image_0[0][0], 0, #PosX_0[0], #PosY_0[0], 0, 0, 1366, 768, 20, 50, 50, 70, 10, 20, 33, 1, -1);
Ищем изображение совпавшее хотя бы на одну треть от того что ищем с колебаниями ДО:
меньше на 20 - больше на 50 (красный), меньше на 50 - больше на 70 (Зеленый), меньше на 10 - больше на 20 (Синий).

Для остановки работы скрипта нажимаем CTRL+SHIFT+Z

На быстродействие поиска размер искомого файла почти не оказывает влияние. Влияет количество пикселей не имеющих фоновый цвет.