Здравствуйте Гришин Сергей, Вы писали:
ГС>Доброе время суток.
ГС>Необходимо захватить кусок экрана и взять с него биты, т.е.
ГС> ScreenDC := CreateDC('DISPLAY', nil, nil, nil); ГС> MemDC := CreateCompatibleDC(ScreenDC); ГС> Bitmap:= CreateDIBSection(ScreenDC,FBitInfo,DIB_RGB_COLORS, FBuffer,0,0); ГС> SelectObject(memDC,Bitmap); ГС> BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY);
ГС>Так вот BitBlt в случае 1024х768х24 работает СЕКУНДУ !!!
ГС>Может кто подскажет, где собака зарыта.
ГС>P.S. GetDiBits работает также долго.
Ты захватываешь свой кусок экрана? Наверное нет...
Здравствуйте Гришин Сергей, Вы писали:
ГС>Здравствуйте Edmond, Вы писали:
E>>Ты захватываешь свой кусок экрана? Наверное нет...
ГС>Нет, захватываю вообще весь экран, но сути это не меняет. Переброска из DC в DIB длится СЕКУНДУ !
Видимо, по другому не выйдет.... Интересно а Принт скрин быстрей работает?
Здравствуйте Гришин Сергей, Вы писали:
ГС>Здравствуйте Edmond, Вы писали:
E>>Видимо, по другому не выйдет.... Интересно а Принт скрин быстрей работает?
ГС>прикол в том, что есть программа удаленной работы, которая не использует не OpenGL, ни DirectX, а экран хватает раз 10 в секунду
Мона дурацкий вопрос? А нафига вам собссно DiB?
Попробуй CreateCompatibleBitmap()
Здравствуйте Гришин Сергей, Вы писали:
BM>>Мона дурацкий вопрос? А нафига вам собссно DiB? BM>>Попробуй CreateCompatibleBitmap()
ГС>Нужны пикселы. А после CreateCompatibleBitmap нужно использовать GetDiBits, что ткаже небыстро работает
Вот тебе код на VB, все отлично работает безо всяких Dib.......
Dim hDCMemory As Long
Dim hBmp As Long
Dim hBmpPrev As Long
Dim r As Long
Dim hdcsrc As Long
hdcsrc = GetWindowDC(hWndSrc) ' Get device context for entire window.
' Create a memory device context for the copy process.
hDCMemory = CreateCompatibleDC(hdcsrc)
' Create a bitmap and place it in the memory DC.
hBmp = CreateCompatibleBitmap(hdcsrc, WidthSrc, HeightSrc)
hBmpPrev = SelectObject(hDCMemory, hBmp)
' Copy the on-screen image into the memory DC.
r = BitBlt(hDCMemory, 0, 0, WidthSrc, HeightSrc, hdcsrc, LeftSrc, TopSrc, vbSrcCopy)
' Remove the new copy of the on-screen image.
hBmp = SelectObject(hDCMemory, hBmpPrev)
' Release the device context resources back to the system.
r = DeleteDC(hDCMemory)
r = ReleaseDC(hWndSrc, hdcsrc)
Здравствуйте Гришин Сергей, Вы писали:
ГС>Так вот BitBlt в случае 1024х768х24 работает СЕКУНДУ !!!
ГС>Может кто подскажет, где собака зарыта.
Собака зарыта в том, что видеоадаптеры устроены таким образом, что передача данных из системной памяти в видеопамять выполняется очень быстро (это, все-таки, устройства вывода), а вот в обратную сторону — медленно.
Здравствуйте Гришин Сергей, Вы писали:
ГС>Ты всего лишь копируешь из DC в DC. А ты попробуй из этого битмапа пикселы взять ...
Секундочку!
Давайте разберемся, что именно вам надо, и что вы подразумеваете под "биты".
Вы абсолютно правильно заметили, что я скопировал DC в данном примере, но ведь основной идеей данной операции является копирование битмапа лежащего на этом DC.
Посмотрите на 3 с низу строку и вы увидите, что конечный результат этого примера есть хендл на битмап, если это НЕ то что вам нужно, то тогда я совсем ничего не понимаю......
PS Если вам нужно именно собержание битмапа, а не хендл, то используйте GetObject() что бы получить BITMAP структуру, где lpBits и есть биты.......
Здравствуйте BugMan, Вы писали:
BM>PS Если вам нужно именно собержание битмапа, а не хендл, то используйте GetObject() что бы получить BITMAP структуру, где lpBits и есть биты.......
Здравствуйте Alex Fedotov, Вы писали:
AF>lbBits будет NULL.
хмммммммм...... действительно......
А может вы еще и знаете почему ?
Вообще странно как то, Неужели при выполнении операций описанных Edmond этот напрямую бежит по битмапу с GetPixel()..... слабо верится.....
Здравствуйте BugMan, Вы писали:
AF>>lbBits будет NULL.
BM>хмммммммм...... действительно...... BM>А может вы еще и знаете почему ?
Потому что это DDB. Драйвер видеоадаптера решает, где физически расположены биты DDB. Это может быть либо видеопамять, либо paged pool. Ни та, ни другая память напрямую из user-mode не адресуется, поэтому lpBits равно NULL.
BM>Вообще странно как то, Неужели при выполнении операций описанных Edmond этот напрямую бежит по битмапу с GetPixel()..... слабо верится.....
Там просто слегка оптимизированный вариант memcpy работает.
BM>PS: Мда.... деньги конечно вещь хорошая......
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте BugMan, Вы писали:
AF>>>lbBits будет NULL.
BM>>хмммммммм...... действительно...... BM>>А может вы еще и знаете почему ?
AF>Потому что это DDB. Драйвер видеоадаптера решает, где физически расположены биты DDB. Это может быть либо видеопамять, либо paged pool. Ни та, ни другая память напрямую из user-mode не адресуется, поэтому lpBits равно NULL.
АХА ! А DDB надо понимать Device Dependent Bitmap , понятненько.......
BM>>Вообще странно как то, Неужели при выполнении операций описанных Edmond этот напрямую бежит по битмапу с GetPixel()..... слабо верится.....
AF>Там просто слегка оптимизированный вариант memcpy работает.
И всё то вы знаете, даже подозрительно Кто то там кажется вас про MS уже спрашивал
BM>>PS: Мда.... деньги конечно вещь хорошая......
AF>Особенно когда их много.
Здравствуйте BugMan, Вы писали:
AF>>Там просто слегка оптимизированный вариант memcpy работает.
BM>И всё то вы знаете, даже подозрительно Кто то там кажется вас про MS уже спрашивал
Просто когда ходишь рядом в отладчике, интересные имена функций попадаются, типа win32k!vFastAlignedCopy. Наводит на мысли.
Здравствуйте Гришин Сергей, Вы писали:
ГС>Объясни тупому, почему GetDiBist из 1024х768х32 в 1024х768х32 выполняется 0.5 секунды, а 1024х768х32 в 1024х768х8 0.15 секунды ?
А оно действительно так выполняется? Я могу придумать несколько правдоподобных объяснений, но сначала хотелось бы убедиться, что это действительно так. Кстати, GetDIBits делается с экрана в память или из памяти в память?
Здравствуйте Alex Fedotov, Вы писали:
AF>Здравствуйте Гришин Сергей, Вы писали:
ГС>>Объясни тупому, почему GetDiBist из 1024х768х32 в 1024х768х32 выполняется 0.5 секунды, а 1024х768х32 в 1024х768х8 0.15 секунды ?
AF>А оно действительно так выполняется? Я могу придумать несколько правдоподобных объяснений, но сначала хотелось бы убедиться, что это действительно так. Кстати, GetDIBits делается с экрана в память или из памяти в память?
Очень похоже:
У меня на некоторых машинах 1024х768х8 с экрана в память снималось ~0,8 сек, а 1024х768х32 — ~0,2 сек.
AF>А оно действительно так выполняется? Я могу придумать несколько правдоподобных объяснений, но сначала хотелось бы убедиться, что это действительно так. Кстати, GetDIBits делается с экрана в память или из памяти в память?
Чистая правда. Копирование из экрана сразу в DIB секцию битмапа.