|
|
|
Разработка findcolor, findimage, Pure lua |
|
|
DarkMaster |
31.3.2021, 17:44
|
Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27856
Пользователь №: 11.279
|
Накидал скринилку. Фиксировные битовые константы заголовков сделаны сознательно с целью быть полностью уверенным в том формате, который будет использован. Сюрприз, но bmp продолжает развиваться и у меня не очень много желания обнаружить потом какие-нибудь непереносимые на другие системы скрины или что-нибудь в этом роде. Функция временно требует задания w, h, l. В дальнейшем будет все дергаться из общего массива/буфра загруженных изображений. скринилка
Код ext.saveimage = function(path, a, w, h, l)end do local FILE_READ_DATA = 0x1 local FILE_WRITE_DATA = 0x2
local FILE_SHARE_READ = 0x00000001 local FILE_SHARE_WRITE = 0x00000002
local CREATE_ALWAYS = 0x2
local FILE_ATTRIBUTE_NORMAL = 0x80
local bmp_headers = {} bmp_headers[1] = ffi.new("const unsigned char[2]",{ 0x42, 0x4D} ) -- file_size 4 bytes bmp_headers[2] = ffi.new("const unsigned char[12]",{0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00 }) -- image_width 4 bytes signed integer -- image_height 4 bytes signed integer bmp_headers[3] = ffi.new("const unsigned char[8]",{ 0x01, 0x00, 0x18, -- the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32 0x00, 0x00, 0x00, 0x00, 0x00 }) -- bitmap_size (w*h*3) bmp_headers[4] = ffi.new("const unsigned char[16]",{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 })
ext.saveimage = function(path, a, w, h, l) local f = C.CreateFileA( path, FILE_READ_DATA + FILE_WRITE_DATA, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nil)
local dwbuf = ffi.new'DWORD[1]'
local success = C.WriteFile(f, bmp_headers[1], 2, dwbuf, nil) local success = C.WriteFile(f, ffi.new("uint32_t[1]", h*w*3+54), 4, dwbuf, nil) local success = C.WriteFile(f, bmp_headers[2], 12, dwbuf, nil) local success = C.WriteFile(f, ffi.new("uint32_t[1]", w), 4, dwbuf, nil) local success = C.WriteFile(f, ffi.new("uint32_t[1]", -h), 4, dwbuf, nil) local success = C.WriteFile(f, bmp_headers[3], 8, dwbuf, nil) local success = C.WriteFile(f, ffi.new("uint32_t[1]", w*h*3), 4, dwbuf, nil) local success = C.WriteFile(f, bmp_headers[4], 16, dwbuf, nil) local success = C.WriteFile(f, ffi.cast("const void*", a), h*l, dwbuf, nil)
C.CloseHandle(f) end end Цитата В коде получается используем старый getimage? Только в случае, если используется метод 2 или метод 1. Код по захвату этими методами не переписывался. В первую очередь это обусловлено тем, что смысла нет. Дергать нужно или по хендлу или через 0 - это шустро, проблем, как правило нет. 0 имеет все шансы заменить метод 2.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Madeus |
31.3.2021, 17:51
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8502
Пользователь №: 19.451
Возраст: 32
|
Цитата(DarkMaster @ 31.3.2021, 17:44) Только в случае, если используется метод 2 или метод 1. Код по захвату этими методами не переписывался. В первую очередь это обусловлено тем, что смысла нет. Дергать нужно или по хендлу или через 0 - это шустро, проблем, как правило нет. 0 имеет все шансы заменить метод 2.
Тогда вопрос Код a, w, h, l = getimage (x1, y1, x2, y2, method, abs_crds) -- getimage игнорирует x2, y2
Тут мы вызываем getimage, подразумевается что это новый getimage, но в коде нигде нет ссылки на него. Так же нет строки Код internal.getimage_orig = getimage которая вызовет старый getimage в случае метода 1 и 2, 1 кстати не работает, но он и не нужен) Собственно я добавил строчку выше и вызываю через ext.getimage Идейно думаю было что-то типо Код internal.getimage_orig = getimage ext.getimage = function(x1, y1, x2, y2, handle, abs_flag) код end getimage = ext.getimage a, w, h, l = getimage (x1, y1, x2, y2, method, abs_crds) -- getimage игнорирует x2, y2
Или я что-то не понял?
|
|
|
|
DarkMaster |
31.3.2021, 18:44
|
Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27856
Пользователь №: 11.279
|
getimage 100 итераций вызов + удаление изображения FullHD старый 4.80 новый 1.65 вызов + удаление изображения 1/100 FullHD старый 0.93 новый 0.08 Абс (метод 0) только с новым ибо я не уверен насколько корректно можно вызвать захват по хендлу с абс в рамках старого синтаксиса (не документировано) FullHD 6.0240000000013 1/100 FullHD 2.5 Цитата Хотя тестить в lua - гиблое дело. Я тоже так думал, но при достаточном количестве итераций и контролем входных данных (изображение тоже входные данные), можно получить релевантные результаты. Sutra, скринилку нормальную тестил? Вторая которая.
color.lua ( 31,04 килобайт )
Кол-во скачиваний: 90Сообщение отредактировал DarkMaster - 31.3.2021, 18:56
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Madeus |
1.4.2021, 0:17
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8502
Пользователь №: 19.451
Возраст: 32
|
|
|
|
|
DarkMaster |
1.4.2021, 2:12
|
Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27856
Пользователь №: 11.279
|
1)+ Переделать метод 0 для поиска по относительным координатам 2)+ Переделать возвращаемый массив в <x> <y> <найденный_цвет <искомый_цвет1> <искомый_цвет2> 3)- Добавить шаг поиска. 4)+ Добавить в images хранение высоты, ширины, длины 5)+ Использовать images для скринилки с вызовом скринилки только по адресу изображения. Поменять местами аргументы path, a. 6)+ Переделать cоlor в local c = color(x,y[,color][,deviation][,method][,abs]) 7)- Буфер loadimage 8)- Финдимидж 9)+ Проблема в том что она возвращает x y относительно координат поиска а хорошо бы возвращать реальные координаты.
У меня до сих пор тяжелые думы по поводу шага поиска. Меня он всегда напрягал в плане синтаксиса - лишний мусор, ухудшение читаемости. Ускорять поиск для нахождения галочек звучит странно) В общем и целом хотелось бы услышать еще мнения по этому поводу. Надо ли оно и как это должно выглядеть в плане синтаксиса.
По поводу добавленного color. Идейно - замена color пилота c _частичной_ обратной совместимостью. Основная задача в рамках упрощенного синтаксиса вызвать findcolor на одну точку и вернуть текущий цвет. Добавленные параметры цвета и deviation созданы с целью упрощенного использования диапазонов в условиях, например: if color(x,y, 0xFF00FF) then if color(x,y, "0xFF00FF-0xFF22FF") then ибо творить писанину типа: if color(x,y) == 0xFF00FF and color(x,y) == 0xFF01FF then когда цвет плавает на единичку откровенно утомило. Сравнивать же диапазоны сейчас и вовсе не реально. Ну и собственно с введением данного чуда предлагаются к удалению все color_deviation_* Так же хотелось бы мнение услышать.
Сообщение отредактировал DarkMaster - 1.4.2021, 2:48
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Madeus |
1.4.2021, 2:35
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8502
Пользователь №: 19.451
Возраст: 32
|
Цитата(DarkMaster @ 1.4.2021, 2:12) У меня до сих пор тяжелые думы по поводу шага поиска. Меня он всегда напрягал в плане синтаксиса - лишний мусор, ухудшение читаемости. Ускорять поиск для нахождения галочек звучит странно) В общем и целом хотелось бы услышать еще мнения по этому поводу. Надо ли оно и как это должно выглядеть в плане синтаксиса.
Я реального применения не нашел, а обычно действительно проблема была с синтаксисом, вместе с заменой координат случайно удалялся шаг. Цитата(DarkMaster @ 1.4.2021, 2:12) По поводу добавленного color. Идейно - замена color пилота c _частичной_ обратной совместимостью. Основная задача в рамках упрощенного синтаксиса вызвать findcolor на одну точку и вернуть текущий цвет. Добавленные параметры цвета и deviation созданы с целью упрощенного использования диапазонов в условиях, например: if color(x,y, 0xFF00FF) then if color(x,y, "0xFF00FF-0xFF22FF") then ибо творить писанину типа: if color(x,y) == 0xFF00FF and color(x,y) == 0xFF01FF then когда цвет плавает на единичку откровенно утомило. Сравнивать же диапазоны сейчас и вовсе не реально. Ну и собственно с введением данного чуда предлагаются к удалению все color_deviation_* Так же хотелось бы мнение услышать.
А за это однозначно лайк, сам вечно писал findcolor в одной точке) Цитата(DarkMaster @ 1.4.2021, 2:12) 9)+ Проблема в том что она возвращает x y относительно координат поиска а хорошо бы возвращать реальные координаты.
Все равно не то возвращает
|
|
|
|
cirus |
1.4.2021, 3:02
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26780
Пользователь №: 16.971
Возраст: 29
|
За всё время шаг поиска использовал только 1 раз. Сканировал поле для игры 3 в ряд. Учитывая, что в последнее время в играх одни и те же картинки отличаются, то такой способ уже не актуален. Цитата вызвать findcolor на одну точку Код --lua local ffi = require("ffi") ffi.cdef[[ int GetDC(int hWnd); int ReleaseDC(int hWnd, int hDC); unsigned long GetPixel(int hdc, int x, int y); ]]
function getcolor(x, y, handle) local HDC = ffi.C.GetDC (handle or 0) local color = ffi.C.GetPixel(HDC, x, y) ffi.C.ReleaseDC(handle or 0, HDC) return color end
local result = getcolor(70, 139, workwindow()) -- координаты, окно hint (result)
|
|
|
|
Madeus |
1.4.2021, 3:04
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8502
Пользователь №: 19.451
Возраст: 32
|
То ли лыжы не едут то ли спать пора. В общем что у меня выходит, color вызывается с ошибкой почему не пойму attempt to call field 'color' (a nil value) Код r = ext.color(1540, 509, 7440813, 1, 'r', 0) Из того что в коде: Код local cc = findcolor(x, y, x, y, method, 1, deviation, deviation_type, abs_flag)
пропущен 'c' цвет короче Код Возвращает только х координату И еще я бы последовательность method deviation deviation_type оставил как в findcolor чтобы не путаться да и еще abs добавить сейчас его нет
|
|
|
|
DarkMaster |
1.4.2021, 3:19
|
Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27856
Пользователь №: 11.279
|
Цитата То ли лыжы не едут то ли спать пора. И то и другое. Спать пора - я не ту версию залил, это промежуточная была, там и не должно было нифига работать. Продолжение банкета уже завтра. Цитата GetPixel Хз почему, но эта радость была тормознутее, чем снятие скриншота и вытаскивание из него отдельной точки + все проблемы с перекрытыми окнами. Насколько я знаю на гет пиксиле были построены ифы в старом синтаксисе и метод 1 в финдах. Цитата И еще я бы последовательность method deviation deviation_type оставил как в findcolor чтобы не путаться И да и нет. Я себе легко представляю запись где пристуствует некоторый deviation, ибо лениво все это раскладывать на каналы. Единичку влепил и шуршит нормально. Обратную же ситуацию не представляю. Можно закинуть метод после девиэшена в финдколоре, и вроде даже на пользу пойдет. Но тогда встает вопрос финдимиджа. Либо теряем совместимость либо финдколор и имидж будут в разных последовательностях. Как сделать правильно я хз. Если поправить именно color, то будет так же, как и с шагом: color(x,y,c,nil,1) - и этот nil будет выбешивать. Сообщение отредактировал DarkMaster - 1.4.2021, 3:20
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|