Лучший способ передачи растрового объекта по локальной сети - PullRequest
0 голосов
/ 04 июня 2009

Мне нужен самый быстрый способ передачи растрового объекта по локальной сети в C #.

Абдул Халик

Ответы [ 2 ]

4 голосов
/ 04 июня 2009

Слово «лучший» в лучшем случае является субъективным термином: -)

Если вы говорите о скорости, то это зависит от размера растрового изображения. С локальной сетью, работающей на скорости 100 Мбит / с, вы можете ожидать примерно 1 секунду для каждых 10 МБ файла. Для небольшого файла просто передайте его как есть. При некотором размере файла стоит сжать файл, передать его и разархивировать на другом конце, просто потому, что загрузка ЦП выполняется быстрее, чем загрузка сети.

Но я думаю, что вы будете говорить о довольно больших файлах, чтобы сделать это дополнительное кодирование полезным.

Обновление:

Поскольку вы говорите о кадре захвата экрана, скажем, мы находимся в 1280x1024, 32bpp. Полный экран будет занимать 5M, что должно передаваться через 100 Мбит / с в локальной сети за секунду (если позволяет другой сетевой трафик). На мой взгляд, не стоит больше пытаться ускорить это, поскольку накладные расходы на сжатие перевесят экономию во времени.

Если вы будете передавать видео , это другое дело. Тогда вы не будете отправлять новое изображение для каждого кадра - вы будете обрабатывать дельты и передавать только эту информацию, полагаясь на тот факт, что экран, как правило, только немного меняется в каждом кадре.

Это зависит от того, для чего вы собираетесь использовать изображения. Один снимок экрана, просто отправьте двоичную информацию. Что-нибудь еще, ну, вам нужно дать нам больше деталей.

Для передачи видео мы на самом деле проделали некоторую работу над различными методами сжатия.

Самое простое, на что вы можете посмотреть - это разделить экран на (например, матрицу 16x16) и передать только измененные элементы.

Так, например, каждый кадр будет состоять из 256-битной битовой маски, указывающей, какие элементы изменились. Затем за этой битовой маской следуют сами элементы.

Этот алгоритм означает, что наименьшая дельта кадра составляет 32 байта (если экран не изменился). Самый большой размер всего на 32 байта больше, чем у полноэкранного дампа.

Один из других методов, которые мы использовали, состоял в том, чтобы просто сохранить изменившиеся положения верхнего и нижнего правого точек пикселя и передать эти два значения вместе со всем прямоугольником, ограниченным ими.

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

0 голосов
/ 14 декабря 2009

Вот ошибка в .NET V2.0 SP1 и .NET 3.5 версии CopyFromScreen (). Он пропускает дескриптор, через некоторое время вы исчерпаете доступные дескрипторы и получите такие странные сообщения об ошибках. Вы не можете использовать его в его нынешнем состоянии, проверьте этот поток для другого способа сделать это с помощью P / Invoking функций Windows API.

также есть хорошее решение, найденное по этой ссылке.

...