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

Вниз

Как снимать скриншоты десктопа без тормозов (GDI)   Найти похожие ветки 

 
yuravss   (2003-02-09 16:12) [0]

Хай !
Не могу справиться с проблемой. Целый день уже роюсь в MSDN и в
интернете. Вобщем выручайте !!!!!!!!!!
Пишу программу типа RAdmina (должна снимать копии экрана и их быстро передавать по сети).
Снимки экрана я делаю., используя GDI API - каждые 100 мс:

procedure TForm1.Timer1Timer(Sender: TObject);
const BuffSize=1000;
var ScreenDC, MemDC:HDC;
Bitmap: HBITMAP;
buff: array[0..BuffSize-1] of byte;
begin
ScreenDC := GetDC(0);
MemDC := CreateCompatibleDC(ScreenDC);
Bitmap:=CreateCompatibleBitmap(ScreenDC, 1024, 768);
SelectObject(memDC,Bitmap);

BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY);
GetBitmapBits(Bitmap, BuffSize, @buff); //Копируем битмап в буффер
// Некоторые действия пикселями в буффере, например пересылка буффера
в сеть
// ......
ReleaseDC(0, ScreenDC);
end;

Оно то работает, но так тормозит, что даже мышь не шевелиться в
Windows"e.
Тормоза вызваны главным образом функцией GetBitmapBits. Я ее вызываю
чтобы получить пиксели (битмап) и отправить их в сеть через сокет.
-------------------------
ВОПРОС 1:
Как можно получить доступ к пикселям Bitmap после выполнения BitBlt ?
т.е я не хочу их копировать в дополнительный буффер функцией GetBitMaps.
Ведь после выполнения функции
BitBlt(MemDC,0,0,1024,768,ScreenDC,0,0,SRCCOPY) я уже получаю гдето в
памяти битовую карту Bitmap с копией десктопа.
А можно ли напрямую получить доступ к пикселям самого десктопа не
копируя их в дополнительный Bitmap ?

ВОПРОС 2:
Как мне лучше битмап передавать по сети ? Хотелось бы какой нибудь
компресии битмапа. И во вторых не хотелось бы иметь проблем с
отображением битмапа на удаленной машине (имеется ввиду апаратная
зависимость формата DDB).


 
Jel ©   (2003-02-10 12:32) [1]

А для чего вообще связываться с GetBitmapBits? Если кроме отправки по сети ничего не нужно то почему бы не создать tBitmap и не скопировать десктоп на него. А потом, скажем tBitmap.SaveToStream.

Для компрессии можно использовать ZLib. Она неплохо управляется с потоками.


 
yuravss   (2003-02-10 15:08) [2]

Я хочу после копирования битмап по кускам отправлять в сеть и, кроме того, сжимать в PNG или ZLIB или че-нить другое.
Надо же нагрузку на сеть уменьшить. Чтобы быстро обработать копию изображения асмовскими инструкциями мне нужно чтобы она находилась в буффере, а не обращаться к пикселям через медленные вызовы property-функций.


 
i-C3H7OH ©   (2003-02-11 14:16) [3]

используй CreateDIBSection - имеешь доступ к массиву пикселей и BitBlt сделать можно.

вообще-то в Вин2000 есть специальная технология для получения снимков экрана по сети. хоть убей не помню как называется.



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

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

Наверх




Память: 0.47 MB
Время: 0.014 c
6-70425
Vovaka
2003-03-25 09:39
2003.05.22
Как получить текущий DNS-сервер ?


14-70512
leseal
2003-05-04 05:24
2003.05.22
С чего начать???


1-70352
DJ Vano
2003-05-09 14:15
2003.05.22
Прозрачность


1-70375
klyonov
2003-05-08 17:19
2003.05.22
WS_EX_TRANSPARENT и не только


1-70234
Dankin
2003-05-11 13:33
2003.05.22
Диалог выбора директории.