Сравнение двух изображений и передача разницы по сети или передача каждый раз нового изображения?
Есть клиент-серверное приложение, передающее с сервера на клиент скриншот экрана.
Вопросы:
1. Можно ли как-то упаковать изображение, чтоб оно весило меньше и имеет ли это смысл?
2. Есть ли возможность как-то сравнить 2 изображения, найти разницу и как-то ее передать по сети, чтоб на принимающей стороне только внести эту разницу в предыдущее изображение?
Т.е. Берем первый скриншот, передаем его с сервера на клиент. К примеру, он весит пару мегабайт. (jpeg качества 100 с разрешением 1920х1080).
Берем второй скриншот, сравниваем его с предыдущим, находим разницу (передвинули курсор, напечатали букву, нажали кнопку в какой-либо программе и т.д., что отобразилось на экране), передаем эту разницу на клиент и там в предыдущий скриншот вставляем эту разницу, чтоб получилось то, что было на сервере.
Что будет быстрее, найти эту разницу и передать и потом восстановить на клиенте, или просто отправлять изображения с ухудшением качества, к примеру, до 50... А то и меньше. При передаче по сети, главное, чтоб объем передаваемых данных был меньше
Где-то я читал, что таким образом действуют видеокодеки при обработке фильмов. Т.е. не сохраняют каждый кадр, а фактически имеют только изменения кадров, которые и прорисовываются, если есть определенная разница между кусками изображения. От этого на сценах с медленным движением камеры быстро движущиеся изображения отрисовываются нормально, а фон, который двигается очень медленно - как будто перескакивает, если смещается на определенную величину. Таким образом размер видеофайла становится намного меньше, чем если бы сохранялся каждый кадр отдельно.
Да, можно упаковать сжатием как без потерь так и с потерями. Да, можно передавать только изменившуюся часть картинки. Что именно будет быстрее - зависит от оборудования, канала, эффективности реализации алгоритмов. Но обычно именно передача только части изображения будет быстрее.
А в C# есть что-то такое, что позволит провернуть этот фокус с проверкой изображения на частичное изменение и передачу этих изменений по сети с последующим изменением прошлого изображения с учетом этих изменений?
VoidVolker, Я имел в виду готовые алгоритмы по сверке изображений на частичное изменение и какая-то компактная форма этих изменений для последующей передачи по сети.
Или тут нужно просто по циклу записать в byte[] координаты измененных пикселей и новый цвет этих пикселей и передавать этот массив по сети?
Саму передачу по сети я уже изучаю. Сокеты, стримы etc...
Зачем изобретать велосипед? Все это уже используется в протоколе VNC. (RFB). При одном из методов сжатия передается упакованый xor между предыдущим и последующим кадрами.