Здравствуйте, гость ( Вход | Регистрация )

30 страниц V « < 3 4 5 6 7 > »   
Ответить в эту темуОткрыть новую тему
> Разработка findcolor, findimage, Pure lua
DarkMaster
сообщение 31.3.2021, 17:44
Сообщение #81


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 31.3.2021, 17:51
Сообщение #82


****

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

Или я что-то не понял?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 31.3.2021, 17:59
Сообщение #83


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Тест старого и нового имиджа по хендлу
Код

зона        old           new
800x800   28.798       5.506
400x400   28.439       1.809
200x200   28.642       1.045
100x100   28.422       0.623
50x50    28.533       0.686

Выполнялся цикл на 1000 итераций.
Как уже говорил ранее, в старом однозначно где-то присутствует якорь.
В новом скорость зависит от зоны захвата.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.3.2021, 18:07
Сообщение #84


***********

Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27856
Пользователь №: 11.279



Круто я когда-то лажанул. Убрал объявление getimage = ext.getimage, а в коде не заменил. И где должен был использоваться новый захват - получился старый гетимидж.

Цитата
Идейно думаю было что-то типо

Дык оно и было. Потом было подчищено чтобы разделить вызовы на время тестов.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 31.3.2021, 18:12
Сообщение #85


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Хотя тестить в lua - гиблое дело. Можно лишь приблизительно судить о быстродействии. Вроде делаешь каждый раз одно и то же, а разброс по времени бывает ну очень даже приличный.

Я не стал ничего менять, пусть будет старый, пусть будет новый. Кто его знает этот ваш новый - посмотрим ещё будет ли вести себя примерно.

При желании одним росчерком пера можно сразу поменять во всех файлах одновременно старое на новое. Не вижу тут никаких проблем.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 31.3.2021, 18:14
Сообщение #86


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8502
Пользователь №: 19.451
Возраст: 32



Цитата(DarkMaster @ 31.3.2021, 18:07) *

Круто я когда-то лажанул. Убрал объявление getimage = ext.getimage, а в коде не заменил. И где должен был использоваться новый захват - получился старый гетимидж.

Бывает (IMG:style_emoticons/default/smile.gif) Я сам такой же, че то решил потестить: там убрал тут добавил где-то забыл все сломалось...
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.3.2021, 18:44
Сообщение #87


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 31.3.2021, 19:05
Сообщение #88


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Дарк, спасибо за скринилку. Всё, на сегодня хватит. Всё буду смотреть завтра. Наплевать на развитие, заголовок подправить плёвое дело. Я ж говорил, у меня Пилот блокировал файл. На крайняк всегда можно посимвольно в lua записывать. Хотя честно, я просто не представляю как до такого кто-то додумался. 30 лет назад и то всё круче. Тот же Паскаль из того же буфера, хоть на низком, хоть на высоком уровне. Только в lua такая дебильная работа с файлами.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.3.2021, 19:23
Сообщение #89


***********

Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27856
Пользователь №: 11.279



Цитата
Только в lua такая дебильная работа с файлами.

На самом деле там проблема только одна - он делает tostring.
Вообще все эти проблемы лечит fs, насколько мне известно. Это модуль кросс-платформенный. Я часть оттуда дергал/


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 31.3.2021, 22:41
Сообщение #90


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8502
Пользователь №: 19.451
Возраст: 32



Нужно добавить возврат координат найденного цвета, можно еще кол-во (IMG:style_emoticons/default/smile.gif)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 31.3.2021, 23:23
Сообщение #91


***********

Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27856
Пользователь №: 11.279



Функция возвращает таблицу найденных цветов:
x y цвет1 цвет2
x y цвет1 цвет2
x y цвет1 цвет2
x y цвет1 цвет2
под цветом имеется ввиду диапазон в который попалось. А вообще спасибо, нужно переделать под:
x y найденный_цвет исходный_цвет(не диапазон)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 1.4.2021, 0:11
Сообщение #92


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8502
Пользователь №: 19.451
Возраст: 32



Проблема в том что она возвращает x y относительно координат поиска а хорошо бы возвращать реальные координаты куда можно сразу кликать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.4.2021, 0:12
Сообщение #93


***********

Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27856
Пользователь №: 11.279



Вот для этого тесты и есть =)
Поправлю. Спасибо.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 1.4.2021, 0:17
Сообщение #94


****

Apprentice
Сообщений: 283
Регистрация: 19.11.2019
Группа: Пользователи
Наличность: 8502
Пользователь №: 19.451
Возраст: 32



Супер, спасибо за труды! (IMG:style_emoticons/default/smile.gif) Ждем findimage (IMG:style_emoticons/default/cool.gif)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.4.2021, 2:12
Сообщение #95


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 1.4.2021, 2:35
Сообщение #96


****

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 относительно координат поиска а хорошо бы возвращать реальные координаты.

Все равно не то возвращает
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.4.2021, 2:49
Сообщение #97


***********

Модератор UOPilot
Сообщений: 9.476
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27856
Пользователь №: 11.279



Цитата
Все равно не то возвращает

Хмм.. Вообще я не то залил, но этот фикс вроде норм был. Ща еще погоняю.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 1.4.2021, 3:02
Сообщение #98


**********

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)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Madeus
сообщение 1.4.2021, 3:04
Сообщение #99


****

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' цвет короче
Код

return cc[1][3]

Возвращает только х координату

И еще я бы последовательность method deviation deviation_type оставил как в findcolor чтобы не путаться да и еще abs добавить сейчас его нет
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 1.4.2021, 3:19
Сообщение #100


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

30 страниц V « < 3 4 5 6 7 > » 
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 14.5.2024, 13:58
Designed by Nickostyle