|
Вопрос # 518/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Мне нужно снимать скриншоты с экрана компа, менять на jpg и пересылать на другой комп по сетке. С пересылкой все нормально, но быстродействие съемки экрана и конвертирования меня не устраивает. Использую такие процедуры(см. приложение).
Может быть существуют способы ускорения этого процесса? Подскажите, пожалуйста!
ЗЫ. И еще: как можно сделать так, чтобы скриншоты с фильмов все-таки отображались, а не показывали окно неивестного цвета? Или как сохранять всякие там сглаживания и др. эффекты в скриншотах из игр? Помогите, очень надо.
Приложение: Переключить в обычный режим- function GetScreenshotBitmap: TBitmap;
- var
- DC: HDC;
- R: TRect;
- Window: HWND;
- begin
- Result := TBitmap.Create;
- with Result do
- try
- PixelFormat := pf24bit;
- Transparent := False;
- Window := GetDesktopWindow;
- DC := GetWindowDC(Window);
- try
- GetWindowRect(Window, R);
- Width := R.Right - R.Left;
- Height := R.Bottom - R.Top;
- BitBlt(Canvas.Handle, 0, 0, Width, Height, DC, 0, 0, SRCCOPY);
- finally
- ReleaseDC(Window, DC);
- end;
- except
- Free;
- raise;
- end;
- end;
-
- function GetScreenshotJpeg: TJpegImage;
- var
- TempBmp: TBitmap;
- begin
- TempBmp := GetScreenshotBitmap;
- try
- Result := TJPEGImage.Create;
- with Result do
- try
- Grayscale := False;
- CompressionQuality := 20;
- Performance := jpBestQuality;
- ProgressiveDisplay := False;
- PixelFormat := jf24Bit;
- Assign(TempBmp);
- except
- Free;
- raise;
- end;
- finally
- FreeAndNil(TempBmp);
- end;
- end;
 |
Вопрос задал: Качурин Антон Павлович (статус: Посетитель)
Вопрос отправлен: 24 апреля 2007, 04:38
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, Качурин Антон Павлович!
Сделать быстрее скриншот, наверное, не получится, но Вы можете поместить его образование в отдельный поток и таким образом избавиться от задержек. Например см. код приложения.
На счет сохранения кадров видео - здесь от Вас ничего не зависит, т.к. если изображение не захватывается - это означает, что видеодекодер копирует данные напрямую в буфер видеоадаптера, т.е. в оверлей. Еще многое зависит от видеопроигравателя, так, например CyberLink PowerDVD самостоятельно декодирует многие форматы и часто изображение с него можно захватить аналогичным вашему методом.
Ответ #2. Отвечает эксперт: Вадим К
По поводу потоков - однозначно. По поводу скорости. Время тратиться на Сжатие + передача + Распаковка. Снятие скрина происходит за приблизительно стабильное время.
Можно не сжимать и слать в bmp. В результате скрин снимается за 0.1-0.2 сек и передача от полсекунды до полторы (при разрешении 1024на768, 100мб сеть)
при сжатии в jpeg основное время тратиться на сжатие - до 2 сек. Передача - почти всегда моментально - меньше 0,1с
Но дивные результаты даёт гиф. Сжатие достаточно быстрое - полсекунды и меньше, и передача тоже быстра. Главное - не стараться получить идеальное изображение, а уменьшить кол-во цветов до 256.
По поводу отображения фильмов и игр. Многие из них используют оверлей. Суть его в том, что виндовс рисует черный (синий) квадрат, а видеокарта уже туда генерит картинку. Естественно виндовс не в курсе что там.
Но есть способ, правда не для Делфи:(, который позволяет обойти это Mirron Video Driver. - как бы ещё один дисплей, но невидимый. Анализируя его, можно не только оверлей передавать, но и более качественно передавать картинку - так как это позволяет анализировать что именно изменилось и передавать только изменённые данные. Так работает к примеру RAdmin. Но мне встречались вещи, которые он тоже не может взять - одна прога для управления GSM шлюзом. Он отображал только пустую форму...
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 24 апреля 2007, 13:19
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|