Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.04.13;
Скачать: CL | DM;

Вниз

Быстрый скриншот   Найти похожие ветки 

 
XProger ©   (2007-05-02 01:46) [0]

Необходимо за минимальное время получить весь RGB массив данных текущего состояния экрана.
GetDiBits при моих условиях даёт порядка 24 мс, что неприемлимо :(

Какие помимо этого существуют методы?


 
DVM ©   (2007-05-02 10:49) [1]


> Какие помимо этого существуют методы?

Драйвер свой. Как у Remote Administartor. Подробнее к сожалению не знаю.


 
homm ©   (2007-05-04 07:13) [2]

> GetDiBits при моих условиях даёт порядка 24 мс, что неприемлимо :(

А тебе точно DIB нужен? Если можно обойтись DDB, время снижаеться милиисекунд до 5-и наверное :)


 
Sapersky   (2007-05-04 13:28) [3]

Может, BitBlt будет побыстрее, особенно если установить формат буфера = формату рабочего стола, но вряд ли намного.
Относительно драйверов см. Фень Юаня:
http://irazin.ru/Downloads/Books/Yuan.rar


 
XProger ©   (2007-05-04 17:56) [4]

homm,
Мне нужно периодически получать массив данных пригодный для постобработки и хранения в файле :)

Sapersky, BitBlt сбрасывает на контекст... года 3 назад как-то делал указатель на данные контекста, вспомнить вот не могу :)
За книжку огромное спасибо, думаю найду в ней массу полезного!


 
homm ©   (2007-05-04 20:06) [5]

> года 3 назад как-то делал указатель на данные контекста,
> вспомнить вот не могу :)

И не вспомнишь, т.к. контекст этот области в памяти видеодкарты.


 
XProger ©   (2007-05-04 23:22) [6]

homm, неужели? А как же аппаратная независимость GDI? )


 
homm ©   (2007-05-05 05:31) [7]

> А как же аппаратная независимость GDI?

Ну вот и независимость в том и есть, что ты до апаратной части добраться не сможешь. Это же не указатель на видеопамять, а контекст этого указателя. Что-бы получить указатель на данные этого контеста, в любом случае нужена передача данных в ОП. Посмоти реализацию TBitmap.ScanLines в VCL.


 
XProger ©   (2007-05-05 06:48) [8]

CreateDIBSection + BitBlt даёт 15 мс. Уже лучше, но можно ли быстрее не прибегая к DX или "самописным драйверам"? :)


 
XProger ©   (2007-05-05 06:52) [9]

program ScreenShot;

uses
 Windows, SysUtils;

{$APPTYPE CONSOLE}

type
 TScr = array [0..1] of Byte;
 PScr = ^TScr;
var
 hBmp       : hBitmap;
 DeskDC     : hDC;
 DC         : hDC;
 BFH        : tagBITMAPFILEHEADER;
 BIH        : tagBITMAPINFO;
 ScrX, ScrY : Integer;
 F          : File;
 ScrSize    : Cardinal;
 Bits       : Pointer;
 t : LongWord;
 i : Integer;
begin
 DeskDC  := GetDC(0);

 ScrX     := GetDeviceCaps(DeskDC, HORZRES);
 ScrY     := GetDeviceCaps(DeskDC, VERTRES);
 ScrSize  := ScrX * ScrY * 4;

 with BFH do
 begin
   bfType      := $4D42;
   bfSize      := ScrSize + SizeOf(BFH) + SizeOf(BIH);
   bfReserved1 := 0;
   bfReserved2 := 0;
   bfOffBits   := SizeOf(BFH) + SizeOf(BIH);
 end;

 with BIH.bmiHeader do
 begin
   biSize         := SizeOf(BIH);
   biWidth        := SCRX;
   biHeight       := SCRY;
   biPlanes       := 1;
   biBitCount     := 32;
   biCompression  := BI_RGB;
   biSizeImage    := ScrSize;
   biClrImportant := 0;
 end;

 GetMem(Bits, ScrSize);
 hBmp := CreateDIBSection(DeskDC, BIH, DIB_RGB_COLORS, Bits, 0, 0);
 DC   := CreateCompatibleDC(DeskDC);
 SelectObject(DC, hBmp);

 t := GetTickCount;
 for i := 0 to 9 do
 begin
   BitBlt(DC, 0, 0, ScrX, ScrY, DeskDC, 0, 0, SRCCOPY);
{
   AssignFile(F, "src" + IntToStr(i) + ".bmp");
   Rewrite(F, 1);
   Blockwrite(F, BFH, SizeOf(BFH));
   Blockwrite(F, BIH, SizeOf(BIH));
   Blockwrite(F, bits^, ScrSize);
   CloseFile(F);
}
 end;
 writeln((GetTickCount - t)/10:2:2);
 readln;

 DeleteObject(hbmp);
 FreeMem(Bits);
end.


 
DVM ©   (2007-05-05 15:52) [10]

GetTickCount не очень точно, для таких малых интервалов, лучше QueryPerformanceCounter


 
XProger ©   (2007-05-05 17:29) [11]

DVM, 150 мс +/- 20 мс точности, не так страшно... причём для 100 скриншотов эта цифра в 15 мс практически не изменяется.


 
Sapersky   (2007-05-07 15:04) [12]

XProger ©   (05.05.07 06:52) [9]
GetMem(Bits, ScrSize); - вот этого не надо, CreateDIBSection сама выделяет память.
Ещё у меня на Win98 не хотело работать, пока не поставил
biSize := SizeOf(BIH.header); // 40 байт, а SizeOf(BIH) - 44

но можно ли быстрее не прибегая к DX

По моим тестам DX (DirectDraw) в данном случае никакого эффекта не даёт. Скорость такая же, что и с CreateDIBSection/BitBlt.


 
XProger ©   (2007-05-07 17:07) [13]

Sapersky, спасибо за информацию, выделение памяти это пережитки GetDiBits :)



Страницы: 1 вся ветка

Текущий архив: 2008.04.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
15-1204184827
Riply
2008-02-28 10:47
2008.04.13
RAD Studio "неправильные ошибки".


2-1206015131
WildBoolean
2008-03-20 15:12
2008.04.13
TListBox +OnDrawItem


15-1204035351
avptt
2008-02-26 17:15
2008.04.13
не могу понять


15-1203995117
Светик
2008-02-26 06:05
2008.04.13
Ошибка CRC


4-1186469502
kotbazilio
2007-08-07 10:51
2008.04.13
Active Desktop