![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Как создавать скриншот экрана 30 раз в секунду?
Пробовал такой функцией Код:
var bmp:TBitmap; begin bmp := TBitmap.Create; bmp.Width := Screen.Width; bmp.Height := Screen.Height; BitBlt(bmp.Canvas.Handle, 0,0, Screen.Width, Screen.Height, GetDC(0), 0,0,SRCCOPY); Image1.Width := Screen.Width; Image1.Height := Screen.Height; Image1.Picture.Assign(bmp); bmp.Free; Но функция BitBlt слишком медленная, так что при многократном создании скриншотов окна передвигаются рывками. Точно знаю что есть способы создавать скриншоты быстро, потому что в TeamViewer все работает без глюков. Может быть через DirectX как нибудь можно? Последний раз редактировалось Admin, 19.11.2012 в 15:30. |
|
#2
|
||||
|
||||
|
зачем Image1? у меня 10000 раз вызвать BitBlt на 1280*1024 заняло 25 секунд, т.е. 400 кадров в сек. с сохранением Bitmap в файл 14 кадров в сек.
Код:
var
Bitmap: TBitmap;
DC: HDC;
i: Integer;
TickCount: Cardinal;
begin
TickCount:=GetTickCount;
Bitmap:=TBitmap.Create;
DC:=GetDC(0);
try
Bitmap.Width:=Screen.Width;
Bitmap.Height:=Screen.Height;
for i:=1 to 100 do
begin
BitBlt(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, DC, 0, 0, SRCCOPY);
Bitmap.SaveToFile(Format('%.4d.bmp', [i]));
// Application.ProcessMessages;
// if GetTickCount-TickCount>10000 then Break;
end;
finally
ReleaseDC(0, DC);
Bitmap.Free;
end;
ShowMessage(IntToStr(GetTickCount-TickCount));
end; |
|
#3
|
|||
|
|||
|
Да, BitBlt можно выполнить много раз, но при его многократном выполнении попробуй подвигать окна, они будут двигаться рывками.
Последний раз редактировалось hacker2357, 19.11.2012 в 15:14. |
|
#4
|
|||
|
|||
|
Присоединяюсь к теме, хотел такую же создать)
Действительно, выполнение функции bitblt () несколько замедляет работу системы, даже если не сохранять файл, а только вызывать саму функцию. Тем более, если используется несколько мониторов ! Нагрузка на процессор такая, что спокойно работать не удастся. Может есть какой-нибудь заменитель этой функции ?? |