Delphi. Поиск картинок на экране.
Немного был знаком с 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 в массив медленно:
Похоже на быстрый скриншот вроде: