|
Разработка findcolor, findimage, Pure lua |
|
|
|
  |
Ответов
cirus |
27.3.2021, 21:21
|

         
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26867
Пользователь №: 16.971
Возраст: 29

|
Цитата а в файл сохранить картинку можно? Вариант1 (WriteFile)
Код --lua local ffi = require("ffi") local SRCCOPY = 0x00CC0020 local DIB_RGB_COLORS = 0 local BI_RGB = 0 local GENERIC_WRITE = 0x40000000 local OPEN_ALWAYS = 4 local FILE_ATTRIBUTE_NORMAL = 0x00000080 ffi.cdef[[ typedef long LONG; typedef unsigned short WORD; typedef unsigned long DWORD; typedef DWORD *LPDWORD; typedef unsigned char BYTE; typedef void *LPVOID; typedef const void *LPCVOID; #pragma pack (push, 1) typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits;} BITMAPFILEHEADER; #pragma pack (pop) typedef struct {DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;} BITMAPINFOHEADER; typedef struct {BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD; typedef struct {BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1];} BITMAPINFO; int GetDC(int hWnd); int ReleaseDC(int hWnd, int hDC); int SelectObject(int hdc, int h); int CreateCompatibleDC(int hdc); int CreateCompatibleBitmap(int hdc, int cx, int cy); bool DeleteObject(int ho); bool BitBlt(int hdc, int x, int y, int cx, int cy, int hdcSrc, int x1, int y1, unsigned long rop); int GetDIBits(int hdc, int hbm, unsigned int start, unsigned int cLines, LPVOID lpvBits, BITMAPINFO* lpbmi, unsigned int usage); bool WriteFile(int hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, int lpOverlapped); int CreateFileA(const char* lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, int lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, int hTemplateFile); bool CloseHandle(int hObject); ]]
function screen(path, x, y, x2, y2, handle) local C = ffi.C local hdcWindow = C.GetDC(handle or 0) -- если хендл не указан, то получим скрин с экрана local hdcMemDC = C.CreateCompatibleDC(hdcWindow) local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, x2-x, y2-y) C.SelectObject(hdcMemDC,hbmScreen) C.BitBlt(hdcMemDC, 0, 0, x2-x, y2-y, hdcWindow, x, y, SRCCOPY) -- сохранить в памяти скрин с окна или экрана
local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), x2-x, y2-y, 1, 32, BI_RGB,0,0,0,0,0} }) C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, nil, bi, DIB_RGB_COLORS) -- узнать какого размера нужен массив
local bmpFileHeader = ffi.new('BITMAPFILEHEADER', {0x4d42, bi.bmiHeader.biSizeImage, 0, 0, ffi.sizeof('BITMAPFILEHEADER')+ffi.sizeof('BITMAPINFOHEADER')}) local bits = ffi.new('unsigned char[?]', bi.bmiHeader.biSizeImage) local result = C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, bits, bi, DIB_RGB_COLORS)
local dwWritten = ffi.new('DWORD[1]') local hFile = C.CreateFileA(path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,0)
C.WriteFile(hFile, bmpFileHeader, ffi.sizeof('BITMAPFILEHEADER'), dwWritten, 0) C.WriteFile(hFile, bi, ffi.sizeof('BITMAPINFOHEADER'), dwWritten, 0) C.WriteFile(hFile, bits, bi.bmiHeader.biSizeImage, dwWritten, 0) C.CloseHandle(hFile)
C.ReleaseDC(handle or 0, hdcWindow) C.DeleteObject(hdcMemDC) C.DeleteObject(hbmScreen) end
screen([[C:\screen_desktop.bmp]], 200, 200, 500, 500) -- скрин с экрана screen([[C:\screen_window.bmp]], 200, 200, 500, 500, workwindow()) -- скрин с рабочего окна (может быть перекрыто) Вариант2 (fwrite)
Код --lua local ffi = require("ffi") local msvcrt = ffi.load('msvcrt.dll') local SRCCOPY = 0x00CC0020 local DIB_RGB_COLORS = 0 local BI_RGB = 0 ffi.cdef[[ typedef long LONG; typedef unsigned short WORD; typedef unsigned long DWORD; typedef DWORD *LPDWORD; typedef unsigned char BYTE; typedef void *LPVOID; typedef const void *LPCVOID; #pragma pack (push, 1) typedef struct { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits;} BITMAPFILEHEADER; #pragma pack (pop) typedef struct {DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;} BITMAPINFOHEADER; typedef struct {BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;} RGBQUAD; typedef struct {BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[1];} BITMAPINFO; int GetDC(int hWnd); int ReleaseDC(int hWnd, int hDC); int SelectObject(int hdc, int h); int CreateCompatibleDC(int hdc); int CreateCompatibleBitmap(int hdc, int cx, int cy); bool DeleteObject(int ho); bool BitBlt(int hdc, int x, int y, int cx, int cy, int hdcSrc, int x1, int y1, unsigned long rop); int GetDIBits(int hdc, int hbm, unsigned int start, unsigned int cLines, LPVOID lpvBits, BITMAPINFO* lpbmi, unsigned int usage); int *fopen(const char *filename, const char *mode); int fwrite(const void *buffer, int size, int count, int *stream); int fclose(int *stream); ]]
function screen(path, x, y, x2, y2, handle) local C = ffi.C local hdcWindow = C.GetDC(handle or 0) -- если хендл не указан, то получим скрин с экрана local hdcMemDC = C.CreateCompatibleDC(hdcWindow) local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, x2-x, y2-y) C.SelectObject(hdcMemDC,hbmScreen) C.BitBlt(hdcMemDC, 0, 0, x2-x, y2-y, hdcWindow, x, y, SRCCOPY) -- сохранить в памяти скрин с окна или экрана
local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), x2-x, y2-y, 1, 32, BI_RGB,0,0,0,0,0} }) C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, nil, bi, DIB_RGB_COLORS) -- узнать какого размера нужен массив
local bmpFileHeader = ffi.new('BITMAPFILEHEADER', {0x4d42, bi.bmiHeader.biSizeImage, 0, 0, ffi.sizeof('BITMAPFILEHEADER')+ffi.sizeof('BITMAPINFOHEADER')}) local bits = ffi.new('unsigned char[?]', bi.bmiHeader.biSizeImage) local result = C.GetDIBits(hdcWindow, hbmScreen, 0, y2-y, bits, bi, DIB_RGB_COLORS)
local hFile = msvcrt.fopen(path, "wb") if hFile then msvcrt.fwrite(bmpFileHeader, ffi.sizeof('BITMAPFILEHEADER'), 1, hFile) msvcrt.fwrite(bi, ffi.sizeof('BITMAPINFOHEADER'), 1, hFile) msvcrt.fwrite(bits, bi.bmiHeader.biSizeImage, 1, hFile) msvcrt.fclose(hFile) else log('Файл не открылся') end
C.ReleaseDC(handle or 0, hdcWindow) C.DeleteObject(hdcMemDC) C.DeleteObject(hbmScreen) end
screen([[C:\screen_desktop.bmp]], 200, 200, 500, 500) -- скрин с экрана screen([[C:\screen_window.bmp]], 200, 200, 500, 500, workwindow()) -- скрин с рабочего окна (может быть перекрыто)
|
|
|
|
Сообщений в этой теме
DarkMaster Разработка findcolor, findimage 24.3.2021, 18:01 sutra Я в теме. Я давно отказался от передачи массивов. ... 25.3.2021, 16:34 DarkMaster
Ловлю на слове. Пока хочу допилить, то, что есть,... 25.3.2021, 17:12 sutra Не помню сколько у меня на фул хд. Я же сказал при... 25.3.2021, 17:28 DarkMaster
Ты где тут нашел адекватного?) Ну а вообще тесты ... 25.3.2021, 17:28 sutra Да я понял, но у меня в основном нагрузка на файнд... 25.3.2021, 17:42 DarkMaster По поводу создания изображений и помощи валенкам у... 25.3.2021, 17:50 DarkMaster Из забавного. Речь пойдет о чтении из памяти данны... 26.3.2021, 0:34 sutra Ну вот, зачем спрашивается лопатить фул хд. Разбил... 26.3.2021, 16:43 DarkMaster ну вообще типа да, но типа нет. Поуму нужно делать... 26.3.2021, 16:49 sutra rmem ("unsigned char*",i)[2]
Я собствен... 26.3.2021, 17:07 DarkMaster Автор Cirus
--lua
local ffi = require("ffi... 26.3.2021, 17:31 sutra Понял лишь в общих чертах. Вопрос, а в файл сохран... 26.3.2021, 17:58 DarkMaster
Вот этот момент не совсем ясен. Почему 0 0? Почем... 26.3.2021, 18:00 sutra Я правильно понимаю, что мне надо добавить возврат... 26.3.2021, 18:11 DarkMaster Пока кроме скорости ничего не тестил, по идее он в... 26.3.2021, 18:15 sutra ОК. Буду ждать новостей. Cirus-у отдельное БОЛЬШОЕ... 26.3.2021, 18:16 cirus
Потому что 0 0 это координаты куда скопировать из... 27.3.2021, 1:59 DarkMaster Накидал кучу вопросов Cirus'у и надеюсь, что о... 27.3.2021, 11:41 DarkMaster Собственно то, как вот оно есть.
-- findcolor
-- Ф... 27.3.2021, 13:42 sutra Дарк, прочитал мануал. Что точно нужно добавить - ... 28.3.2021, 10:15 sutra Для чего нужен шаг? Например для поиска активной р... 28.3.2021, 10:41 DarkMaster Как весело провести вечер и утро.
А знаете ли вы,... 28.3.2021, 12:31 sutra Попробовал новый getimage. Работает намного быстре... 28.3.2021, 13:43 DarkMaster
А максимума нет. Размер окна может быть намного б... 28.3.2021, 13:54 sutra Насколько я понимаю, по уму надо бы возвращать адр... 28.3.2021, 13:59 DarkMaster
Я так и делаю.
Все скоро будет =) 28.3.2021, 14:03 DarkMaster Бэкапу пару дней. !@#$ notepad++ 28.3.2021, 23:12 sutra А тут как дела? Подвижки есть? 29.3.2021, 15:11 DarkMaster
Есть, откатился из-за чудес выше до момента пока ... 29.3.2021, 15:51 DarkMaster Захват изображения. Вот так вроде похоже на правду... 29.3.2021, 17:09 Cockney
Ну и идейно я делаю замену пилотовских функций с ... 29.3.2021, 20:33 DarkMaster
Планов очень много, идей очень много. Я очень не ... 29.3.2021, 21:00 Cockney
Планов очень много, идей очень много. Я очень не ... 29.3.2021, 23:47 DarkMaster Если угодно - сглазить не хочу.
Блокнот реально по... 29.3.2021, 23:55 sutra Ну вот, я явился возмутителем спокойствия и благод... 30.3.2021, 11:51 sutra Попробовал сохранить картинку. Ничего не получилос... 30.3.2021, 13:16 cirus
Это начало bmp файла BM.
Указать другую папку, в... 30.3.2021, 13:43 sutra Создаёт файл 14 байт. Доступ к нему действительно ... 30.3.2021, 15:31 sutra Последовательно пишу заголовок. Перегружаю Пилот, ... 30.3.2021, 15:44 sutra Дарк, что-то я не понял как пользоваться твоим ими... 30.3.2021, 17:38 DarkMaster Значит так. Версия из активной разработки. Дальше ... 30.3.2021, 17:38 DarkMaster --lua
local ffi=require "ffi"
local rmem=... 30.3.2021, 17:46 sutra Ни хрена себе ты наворочал. Тут месяц надо разбира... 30.3.2021, 17:47 DarkMaster ext.lg - перекочевало из другого скрипта, в рамках... 30.3.2021, 17:47 sutra Конечно моё мнение субъективно. Но вот зачем вообщ... 30.3.2021, 18:16 DarkMaster
Идейно это был изначально возврат к пилотовскому:... 30.3.2021, 18:19 sutra Может не доглядел (тогда ткни меня носом), но не н... 30.3.2021, 18:34 DarkMaster По разности каналов не делал. В достаточно большой... 30.3.2021, 18:41 sutra Да я всё понимаю. Поэтому и не берусь претендовать... 30.3.2021, 18:43 DarkMaster Если есть любые идеи, как оно должно быть - готов ... 30.3.2021, 18:43 sutra Да, кстати. Что-то у меня не получилось сохранить ... 30.3.2021, 18:45 DarkMaster --lua
local ffi=require "ffi"
local rmem=... 30.3.2021, 18:54 sutra Вот объясните мне почему так? Просто хочу понять, ... 30.3.2021, 20:15 DarkMaster
Это является флагом писать строки сверху-вниз или... 30.3.2021, 20:18 sutra Спасибо, ну примерно так и подозревал. Плохо ничег... 30.3.2021, 20:22 DarkMaster
Ну да, самое крутое не знать и писать. Думаешь я ... 30.3.2021, 20:25 sutra Соответственно 32 битовая модель не требует контро... 30.3.2021, 20:30 Madeus speed = speed + os.clock() - t
Лишняя строчка?) 30.3.2021, 20:32 sutra Эх! Понять бы ещё почему у меня проблемы с зап... 30.3.2021, 20:36 DarkMaster
бенчмарк. Ну для релиза лишняя, для работы не сов... 30.3.2021, 20:42 sutra Перегруз не помог. Нарушается у меня доступ к запи... 30.3.2021, 20:44 Madeus
бенчмарк. Ну для релиза лишняя, для работы не сов... 30.3.2021, 20:59 DarkMaster Можно удалить. Мой код тестов:
speed = 0
catch = 0... 30.3.2021, 21:08 Madeus Если не указать [deviation] вылетает с ошибкой .lu... 30.3.2021, 21:19 DarkMaster
чуть выше писал, что на данный момент только со в... 30.3.2021, 21:27 Madeus У меня одного если не указать "abs" то и... 30.3.2021, 22:51 DarkMaster
Какой метод при поиске указан?
При методе 2 будет... 31.3.2021, 0:00 Madeus
Какой метод при поиске указан?
При методе 2 будет... 31.3.2021, 0:12 DarkMaster Это сделано исключительно для совместимости со ста... 31.3.2021, 0:23 DarkMaster Sutra, я тут в итоге все-таки наткнулся на один уж... 31.3.2021, 0:45 DarkMaster
Кстати низя. Ты никак диапазоном не задашь, что r... 31.3.2021, 2:06 Madeus
Метод 2, тогда понятно, хотя надо проверить скоро... 31.3.2021, 2:06 DarkMaster
В обоих случаях зоны имели одинаковые цвета?
Мето... 31.3.2021, 2:43 cirus
Сделать скрин и искать на скрине, быстрее будет. 31.3.2021, 3:01 DarkMaster 100 прогонов во всех тестах
Фулл хд. Абс выкл.
r ... 31.3.2021, 3:06 Madeus
В целом абс существенным образом не повлияло на о... 31.3.2021, 17:20 sutra
Спасибо Дарк. Конечно так я и сам могу, но по при... 31.3.2021, 11:27 DarkMaster Я его код не тестил. Мне скрины на тот момент были... 31.3.2021, 13:03 DarkMaster Накидал скринилку. Фиксировные битовые константы з... 31.3.2021, 17:44 Madeus
Только в случае, если используется метод 2 или ме... 31.3.2021, 17:51 sutra Тест старого и нового имиджа по хендлу
зона old ... 31.3.2021, 17:59 DarkMaster Круто я когда-то лажанул. Убрал объявление getimag... 31.3.2021, 18:07 Madeus
Круто я когда-то лажанул. Убрал объявление getima... 31.3.2021, 18:14 sutra Хотя тестить в lua - гиблое дело. Можно лишь прибл... 31.3.2021, 18:12 DarkMaster getimage 100 итераций
вызов + удаление изображения... 31.3.2021, 18:44 sutra Дарк, спасибо за скринилку. Всё, на сегодня хватит... 31.3.2021, 19:05 DarkMaster
На самом деле там проблема только одна - он делае... 31.3.2021, 19:23 Madeus Нужно добавить возврат координат найденного цвета,... 31.3.2021, 22:41 DarkMaster Функция возвращает таблицу найденных цветов:
x y ц... 31.3.2021, 23:23 Madeus Проблема в том что она возвращает x y относительно... 1.4.2021, 0:11 DarkMaster Вот для этого тесты и есть =)
Поправлю. Спасибо. 1.4.2021, 0:12 Madeus Супер, спасибо за труды! :) Ждем findimage B) 1.4.2021, 0:17 DarkMaster 1)+ Переделать метод 0 для поиска по относительным... 1.4.2021, 2:12 Madeus
У меня до сих пор тяжелые думы по поводу шага пои... 1.4.2021, 2:35 DarkMaster
Хмм.. Вообще я не то залил, но этот фикс вроде но... 1.4.2021, 2:49 cirus За всё время шаг поиска использовал только 1 раз. ... 1.4.2021, 3:02 Madeus То ли лыжы не едут то ли спать пора. В общем что у... 1.4.2021, 3:04 DarkMaster
И то и другое. Спать пора - я не ту версию залил,... 1.4.2021, 3:19
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|