Delphi. Поиск картинок на экране.

Сергей18 лет в сервисе
Данные заказчика будут вам доступны после подачи заявки
27.11.2020

Немного был знаком с Delphi, сейчас уже подзабыл все.

Хочется немного потренироваться, заодно создав небольшую прикладную програмку.

Если что-то не реализуемое упомянул - поправьте. Если что-то можно сделать лучше - предложите.

Программа будет искать множество предварительно загруженных изображений на экране

и если найдет - показывать их координаты.

2 тестовых изображения (bmp) для поиска - загружать при FormCreate.

Скриншот и поиск изображений делать по таймеру, раз в 500мс.

Если найдено, то пока в Edit1 показывать какое изображение найдено (номер) и по каким координатам.

В Edit2 показать: Сколько мс занял процесс скриншота и поиска изображений.

Сделать скриншот и найти изображения сравнивая по точкам - это я могу. Но хочется получить хорошую скорость:

- ускорить поиск путем сравнения меньшего количества данных (упростив цветовую схему)

- не использовать медленный TBitMap.ScanLine при поиске, а конвертировать изображения в массивы и работать с ними

- при поиске изображений использовать указатели для перемещения по массиву, чтобы не вычислялся каждый раз адрес

- при конвертации скриншота в массив использовать указатели для перемещения по массиву

- не использовать медленный ScanLine для скриншота

Нужен исходник для Delphi не выше версии 10.4.

VCL Forms Application.

Примерно что надо:

type TBmpArray = record

  w : Integer; // ширина

  h : Integer; // высота

  bmp : array of Byte; // набор цветов точек

end;

var

  array_scr : TBmpArray; // скриншот

  array_f1 : TBmpArray; // предварительно загруженное и преобразованное изображение 1

  array_f2 : TBmpArray; // предварительно загруженное и преобразованное изображение 2

Функции:

// Запись в array_scr скриншота первичного дисплея

// один байт - одна запись в TBmpArray.bmp - одна цветная точка (pf8bit)

// Текущая цветовая схема экрана может быть любой, но на выходе всегда pf8bit

function ScreenShot(указатель на array_scr):boolean;

// Чтение и преобразование BMP файла в array_f1

// один байт - одна запись в TBmpArray.bmp - одна цветная точка (pf8bit)

// цветовая схема файла может быть любой, но не менее 256 цветов, а на выходе всегда pf8bit

function ReadBmpToArray(указатель на array_f1):boolean;

// Поиск прямоугольного изображения в массиве 1 в прямоугольном изображении массива 2, например array_f1 в array_scr

// учитывать размеры прямоугольников, то есть если прямоугольник уже не может уместиться по горизонтали - искать со следующей строки

// или если не умещается уже по вертикали - прекратить поиск

// на выходе - boolean, то есть нашлось или нет

// если нашлось, то в R - координаты найденного изображения

function SearchRectangle(указатели на массивы; var R:TRect):boolean;

Материалы в помощь:

Как не перегонять Bitmap в массив медленно:

habr.com/ru/post/196578/

Похоже на быстрый скриншот вроде:

delphimaster.net/view/8-1178055969

Заявки фрилансеров