Текущий архив: 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.45 MB
Время: 0.007 c