Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1195499499
Nucer
2007-11-19 22:11
2008.04.13
Работа с ADO


2-1205598283
DJ_UZer
2008-03-15 19:24
2008.04.13
Прозрачность формы


2-1205829385
Sonia
2008-03-18 11:36
2008.04.13
Файловая переменная, как параметр процедуры


2-1205763221
Berkoot
2008-03-17 17:13
2008.04.13
Надстрочный индекс в Delphi


15-1204081129
Slider007
2008-02-27 05:58
2008.04.13
С днем рождения ! 27 февраля 2008 среда





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский