Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];

Вниз

Как снимать скриншоты десктопа без тормозов (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 вся ветка

Форум: "Media";
Текущий архив: 2003.05.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
14-70436
zumo
2003-05-02 08:10
2003.05.22
Проигрывание avi


14-70471
MasterA
2003-05-03 20:16
2003.05.22
Создание Help


3-70126
ALI
2003-04-28 19:36
2003.05.22
Как экспортировать БД из MDB формата в GDB формат ?


1-70238
boroda
2003-05-11 17:25
2003.05.22
TListView & TTreeView в одном.


14-70455
race1
2003-04-30 10:45
2003.05.22
теория





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский