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

> Разработка findcolor, findimage, Pure lua
DarkMaster
сообщение 24.3.2021, 18:01
Сообщение #581


***********

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



Собственно обсуждение багов, фич, функционала, тесты и прочее.

Сообщение отредактировал DarkMaster - 27.3.2021, 13:38


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


***********

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



Захват изображения. Вот так вроде похоже на правду. Пока никуда еще в финды не подсовывал. Утрачено реально дофига, но там было очень много моментов, которые надо было понять и осознать. Восстановлю, конечно, шустрее, чем писать с нуля.

getimage

Код

local ffi=require "ffi"
local rmem=ffi.cast
local C=ffi.C

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 unsigned char BYTE;
    typedef void *LPVOID;
    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);

    void free(void *ptr);
    void *malloc(size_t size);
]]

local ext = {}
local internal = {}
local images = {}

internal.deleteimage_orig = deleteimage
ext.getimage = function(x1, y1, x2, y2, handle, abs_flag)
    if handle > 2 or handle == 1 then
        local a, w, h, l
        w = x2-x1 + 1
        h = y2-y1 + 1
        
        local hdcWindow = C.GetDC(handle or 0)  -- если хендл не указан, то получим скрин с экрана
        local hdcMemDC = C.CreateCompatibleDC(hdcWindow)
        local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, w, h)
        
        C.SelectObject(hdcMemDC,hbmScreen)
        C.BitBlt(hdcMemDC, 0, 0, w, h, hdcWindow, x1, y1, SRCCOPY)  -- сохранить в памяти скрин с окна или экрана

        local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), w, -h, 1, 24, BI_RGB,0,0,0,0,0} })
        C.GetDIBits(hdcWindow, hbmScreen, 0, h, nil, bi, DIB_RGB_COLORS)   -- узнать какого размера нужен массив

        local bitmap_address = ffi.gc(C.malloc(bi.bmiHeader.biSizeImage), C.free)
        local h_copied = C.GetDIBits(hdcWindow, hbmScreen, 0, h, bitmap_address, bi, DIB_RGB_COLORS)   -- получить битовый массив


        --return h_copied and ffi.cast("int", bitmap_address) or nil, w, h_copied, math.floor(w*3/4+0.75)*4
        if h_copied > 0 then
            a = tonumber(ffi.cast("int", bitmap_address))
            
            images[a] = {}
            images[a].handle = handle
            images[a].hdcWindow = hdcWindow
            images[a].hdcMemDC = hdcMemDC
            images[a].hbmScreen = hbmScreen
            images[a].bitmap_address = bitmap_address

            return a, w, h_copied, math.floor(w*3/4+0.75)*4
        else
            return nil
        end
    else
        return internal.getimage_orig(x1, y1, x2, y2, handle, abs_flag)
    end
end

ext.deleteimage = function(address)
    if images[address] then
        C.ReleaseDC(images[address].handle, images[address].hdcWindow)            
        C.DeleteObject(images[address].hdcMemDC)
        C.DeleteObject(images[address].hbmScreen)
        ffi.C.free(ffi.gc(images[address].bitmap_address, nil)) -- Manually free the memory
        images[address] = nil
    else
        deleteimage_orig(address)
    end
end



Скорре всего:
Код
        C.ReleaseDC(images[address].handle, images[address].hdcWindow)             
        C.DeleteObject(images[address].hdcMemDC)
        C.DeleteObject(images[address].hbmScreen)

Можно выкинуть в getimage и прям там уничтожать, но я пока не тестил.

Ну и идейно я делаю замену пилотовских функций с полной обратной совместимостью. Т.е. предполагается:
deleteimage = ext.deleteimage
getimage = ext.getimage
без какого-либо ущерба для старых скриптов.

Сообщение отредактировал DarkMaster - 29.3.2021, 17:21


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

Сообщений в этой теме
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
cirus   --lua local ffi = require("ffi") ...   27.3.2021, 21:21
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
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
6 страниц V  1 2 3 > » 


Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

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