Форум: "Media";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
ВнизБыстрый скриншот Найти похожие ветки
← →
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 вся ветка
Форум: "Media";
Текущий архив: 2008.04.13;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.006 c