Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 518

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Мне нужно снимать скриншоты с экрана компа, менять на jpg и пересылать на другой комп по сетке. С пересылкой все нормально, но быстродействие съемки экрана и конвертирования меня не устраивает. Использую такие процедуры(см. приложение).

Может быть существуют способы ускорения этого процесса? Подскажите, пожалуйста!

ЗЫ. И еще: как можно сделать так, чтобы скриншоты с фильмов все-таки отображались, а не показывали окно неивестного цвета? Или как сохранять всякие там сглаживания и др. эффекты в скриншотах из игр? Помогите, очень надо.

Приложение:
  1. function GetScreenshotBitmap: TBitmap;
  2. var
  3. DC: HDC;
  4. R: TRect;
  5. Window: HWND;
  6. begin
  7. Result := TBitmap.Create;
  8. with Result do
  9. try
  10. PixelFormat := pf24bit;
  11. Transparent := False;
  12. Window := GetDesktopWindow;
  13. DC := GetWindowDC(Window);
  14. try
  15. GetWindowRect(Window, R);
  16. Width := R.Right - R.Left;
  17. Height := R.Bottom - R.Top;
  18. BitBlt(Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
  19. finally
  20. ReleaseDC(Window, DC);
  21. end;
  22. except
  23. Free;
  24. raise;
  25. end;
  26. end;
  27.  
  28. function GetScreenshotJpeg: TJpegImage;
  29. var
  30. TempBmp: TBitmap;
  31. begin
  32. TempBmp := GetScreenshotBitmap;
  33. try
  34. Result := TJPEGImage.Create;
  35. with Result do
  36. try
  37. Grayscale := False;
  38. CompressionQuality := 20;
  39. Performance := jpBestQuality;
  40. ProgressiveDisplay := False;
  41. PixelFormat := jf24Bit;
  42. Assign(TempBmp);
  43. except
  44. Free;
  45. raise;
  46. end;
  47. finally
  48. FreeAndNil(TempBmp);
  49. end;
  50. end;


Качурин Антон Павлович Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Качурин Антон Павлович (статус: Посетитель)
Вопрос отправлен: 24 апреля 2007, 04:38
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, Качурин Антон Павлович!
Сделать быстрее скриншот, наверное, не получится, но Вы можете поместить его образование в отдельный поток и таким образом избавиться от задержек. Например см. код приложения.
На счет сохранения кадров видео - здесь от Вас ничего не зависит, т.к. если изображение не захватывается - это означает, что видеодекодер копирует данные напрямую в буфер видеоадаптера, т.е. в оверлей. Еще многое зависит от видеопроигравателя, так, например CyberLink PowerDVD самостоятельно декодирует многие форматы и часто изображение с него можно захватить аналогичным вашему методом.

Приложение:
  1.  
  2. CreateThread(nil, 0, @GetScreenshot, nil, 0, X);


Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 24 апреля 2007, 12:25

Ответ #2. Отвечает эксперт: Вадим К

По поводу потоков - однозначно. По поводу скорости. Время тратиться на Сжатие + передача + Распаковка. Снятие скрина происходит за приблизительно стабильное время.
Можно не сжимать и слать в bmp. В результате скрин снимается за 0.1-0.2 сек и передача от полсекунды до полторы (при разрешении 1024на768, 100мб сеть)
при сжатии в jpeg основное время тратиться на сжатие - до 2 сек. Передача - почти всегда моментально - меньше 0,1с
Но дивные результаты даёт гиф. Сжатие достаточно быстрое - полсекунды и меньше, и передача тоже быстра. Главное - не стараться получить идеальное изображение, а уменьшить кол-во цветов до 256.

По поводу отображения фильмов и игр. Многие из них используют оверлей. Суть его в том, что виндовс рисует черный (синий) квадрат, а видеокарта уже туда генерит картинку. Естественно виндовс не в курсе что там.
Но есть способ, правда не для Делфи:(, который позволяет обойти это Mirron Video Driver. - как бы ещё один дисплей, но невидимый. Анализируя его, можно не только оверлей передавать, но и более качественно передавать картинку - так как это позволяет анализировать что именно изменилось и передавать только изменённые данные. Так работает к примеру RAdmin. Но мне встречались вещи, которые он тоже не может взять - одна прога для управления GSM шлюзом. Он отображал только пустую форму...

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 24 апреля 2007, 13:19


Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:53
Выполнено за 0.03 сек.