|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Как создавать скриншот экрана 30 раз в секунду?
Как создавать скриншот экрана 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 () несколько замедляет работу системы, даже если не сохранять файл, а только вызывать саму функцию. Тем более, если используется несколько мониторов ! Нагрузка на процессор такая, что спокойно работать не удастся. Может есть какой-нибудь заменитель этой функции ?? |