Форум по программированию Delphi Sources

 



Вернуться   Форум по программированию Delphi Sources > Все о Delphi > Рабочий стол
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.11.2012, 14:40
hacker2357 hacker2357 вне форума
Прохожий
 
Регистрация: 19.11.2012
Сообщения: 2
Репутация: 10
По умолчанию Как создавать скриншот экрана 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  
Старый 19.11.2012, 15:04
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59585
По умолчанию

зачем 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;
+TeamViewer наверняка передает только изменяющиеся участки экрана
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 19.11.2012, 15:11
hacker2357 hacker2357 вне форума
Прохожий
 
Регистрация: 19.11.2012
Сообщения: 2
Репутация: 10
По умолчанию

Да, BitBlt можно выполнить много раз, но при его многократном выполнении попробуй подвигать окна, они будут двигаться рывками.

Последний раз редактировалось hacker2357, 19.11.2012 в 15:14.
Ответить с цитированием
  #4  
Старый 27.05.2013, 01:39
forum.sources.ru forum.sources.ru вне форума
Прохожий
 
Регистрация: 22.04.2013
Сообщения: 31
Версия Delphi: d2,4,6,7,8,xe
Репутация: 10
Восклицание

Присоединяюсь к теме, хотел такую же создать)

Действительно, выполнение функции bitblt () несколько замедляет работу системы, даже если не сохранять файл, а только вызывать саму функцию.
Тем более, если используется несколько мониторов ! Нагрузка на процессор такая, что спокойно работать не удастся.

Может есть какой-нибудь заменитель этой функции ??
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:52.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources", 2004-2019

ВКонтакте   Facebook   Twitter