| 
| 
 | Вопрос # 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
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |