Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 20.06.2014
Сообщений: 18

Клиент - сервер. Пересылка Bitmap

20.11.2016, 12:42. Показов 1758. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача такая: Захватить видео с вебкамеры на программе-сервере, добавить в последние биты каждого пикселя, биты какого либо файла, принять видео на клиенте, с возможностью сохранить отправленный с сервера файл.

Проблема такая: сильно теряется качество bitmap (перед отправкой ~ 600Кб, после принятия ~ 30Кб). Отправляю и принимаю byte массив.

Отправляю с сервера:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    ...
    bPic = (Bitmap)eventArgs.Frame.Clone(); //изображение с Вебкамеры
    tcpStream = tcp.GetStream();
        if (tcp.Client.Connected)
        {
        if (openFiledia)
                {
        ... //Добавление в  последние биты выбранного файла
        }
        byte[] bytes = null;
            int port = 11000;
            ipEndPoint = new IPEndPoint(IPAddress.Loopback, port);
            bytes = ConvertToByte(bPic);                     // Получаем изображение в виде массива байтов
            tcpStream.Write(bytes, 0, bytes.Length);
        }
        private byte[] ConvertToByte(Bitmap bmp)
        {
            MemoryStream memoryStream = new MemoryStream();
            bmp.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
            return memoryStream.ToArray();
        }
Принимаю на клиенте:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
...
                int port = 11000;
                ipEndPoint = new IPEndPoint(IPAddress.Loopback, port);
                // создание соединения с сервером
                newClient.Connect(ipEndPoint);
                NetworkStream tcpStream = newClient.GetStream();
        while (true)
                {
                    try
                    {
                        MemoryStream frameInStream = new MemoryStream();
                        byte[] bytes = new byte[newClient.ReceiveBufferSize];
                        int bytesRead = tcpStream.Read(bytes, 0, newClient.ReceiveBufferSize);
                        frameInStream.Write(bytes, 0, bytes.Length);
            GetData(frameInStream);
                        frameInStream.Close();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Сервер был выключен");
                        break;
                    }
                }
        
    private void GetData(MemoryStream bytes)
        {
            Bitmap bmp =  new Bitmap(bytes);
            try
            {
                if (bmp.GetPixel(0, 0) == Color.FromArgb(0,0,0))
                {           
            //Собираю файл из последних битов пикселя
            //bmp.Save("D:/Receive.bmp");  сохраненное изображение весит ~ 30КБ вместо 
                            // отправленных ~ 600КБ 
            ...
                }
                bytes = new MemoryStream();
            }
            catch (Exception ex)
            {
                MessageBox.Show(Convert.ToString(ex));
            }
            pictureBox1.Image = bmp;
        }
Пробовал сохранять изображение перед отправкой и сразу как получили, кадры абсолютно одни и те же, но на приеме кадр внешне хуже качества. Не понимаю как такое вообще может быть т.к. отправляю и принимаю byte[]. Изображение перед отправкой действительно хранит выбранный файл, после приема естественно считать не получается.
Так же в кадре который содержит файл закрашиваю пиксел(0,0) черным, но на приеме он так же теряет этот цвет, т.е. внешне он кажется так же черным но по факту ~ RGB(11, 14, 9)
Вложения
Тип файла: rar v2_Aforge.rar (807.1 Кб, 4 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2016, 12:42
Ответы с готовыми решениями:

Составить клиент и сервер (пересылка строки)
Мне нужно реализовать данную программу: Клиент вводит с клавиатуры строку символов и посылает ее серверу. Признак окончания ввода строки –...

Зависает сервер при создании приложения типа клиент/сервер
Зависает сервер при создании приложения типа клиент/сервер using System; using System.Collections.Generic; using...

Как отправить json с клиента на сервер (клиент - прога на C#, сервер - файл PHP)
На хостинге есть файл php, как мне отправить к этому файлу json c помощью C# и как получить его с помощью php? А также как мне отправить,...

10
11 / 11 / 4
Регистрация: 03.07.2014
Сообщений: 28
20.11.2016, 15:22
Всё дело в том что при отправке 600кб данных, драйвер сетевой карты и разбивает ваши данные на кусочки меньше, и вы принимаете только первый кусок...

Добавлено через 1 минуту
Совет: используйте WCF для передачи данных по сети, там таких проблем вообще нет.
1
0 / 0 / 0
Регистрация: 20.06.2014
Сообщений: 18
21.11.2016, 08:12  [ТС]
но размер массива byte и при отправке и при приеме совпадает

Добавлено через 8 минут
возможно ли как то разбивать кадр до отправки и собирать на приеме, чтобы оставить tcp?

Добавлено через 8 часов 22 минуты
разобрался сам
перед тем как принимать увеличил буфер приема:
C#
1
2
3
4
....
                        receiver.ReceiveBufferSize = 1048576;
                        byte[] bytes = new byte[receiver.ReceiveBufferSize];
...
Но теперь проблема в другом: отправляемый файл не может превысить ~ 300Кб так как размер изображения 640х480, как можно перед отправкой разбить файл и отправлять в подряд идущих кадрах куски по 300Кб, и так же файл собрать на клиенте?
0
Эксперт .NET
 Аватар для Usaga
14310 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,418
21.11.2016, 08:44
neyron_qwq, не нужно буфер таким большим делать. Несколько десятков килобайт - за глаза. Посылай данные порциями: заполнил буфер, дождался, пока данные отправились, потом следующую порцию в буфер. И так пока весь кадр не отправится.
0
0 / 0 / 0
Регистрация: 20.06.2014
Сообщений: 18
21.11.2016, 09:52  [ТС]
Usaga, таким образом не получалось, если запустить программу через отладчик и посмотреть что приходит что уходит, то всё нормально и кадр отрисововался хорошо, но если просто запустить программу, то терялось всё кроме первого куска
0
132 / 82 / 29
Регистрация: 01.10.2014
Сообщений: 263
21.11.2016, 10:23
neyron_qwq,
вы же его при отправке сами конвертируете в жпег на 19 строке сервера: bmp.Save(memoryStream, System.Drawing.Imaging.ImageFormat.Jpeg);
потому качество и теряется, тем более без указания этого самого качества конвертирования.
указывайте бмп при сохранении или пнг(он без потери информации).
0
Эксперт .NET
 Аватар для Usaga
14310 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,418
21.11.2016, 10:27
Цитата Сообщение от neyron_qwq Посмотреть сообщение
таким образом не получалось
Значит фигово реализовано было, что я ещё могу тут сказать.
0
0 / 0 / 0
Регистрация: 20.06.2014
Сообщений: 18
29.11.2016, 19:59  [ТС]
Usaga, почитал на эту тему, и была информация что это особенность tcp, т.к. инфу о доставке он получает и отсылает кусок уже со следующего кадра
0
Эксперт .NET
 Аватар для Usaga
14310 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,418
29.11.2016, 20:17
neyron_qwq, не кадра, а "пакета". TCP отошлёт весь твой буфер, разбив его на пакеты. TCP гарантирует очерёдность отправки пакетов и их целостность. Если какие-то данные теряются, то это либо по вине интернет-канала очень плохого, либо твой алгоритм что-то не то делает.

Кстати, BMP отсылать - действительно глупо. Слишком уж это избыточный по размеру формат (данные в нём не сжаты, но это не причина потери данных).
0
0 / 0 / 0
Регистрация: 20.06.2014
Сообщений: 18
30.11.2016, 10:48  [ТС]
Usaga, интернет канал тут не причем, я пока тестирую на одном компьютере. и теперь это не важно, сейчас у меня проблема с разбиением файла и отправкой в кадрах
0
Эксперт .NET
 Аватар для Usaga
14310 / 9391 / 1355
Регистрация: 21.01.2016
Сообщений: 35,418
30.11.2016, 11:30
Цитата Сообщение от neyron_qwq Посмотреть сообщение
сейчас у меня проблема с разбиением файла и отправкой в кадрах
Какая в этом может быть проблема ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.11.2016, 11:30
Помогаю со студенческими работами здесь

Сохранение bitmap в удаленный каталог на сервер.
Такая проблема не могу сохранить готовое изображение на удаленный сервер в папку. Нужно по нажатию кнопки программа сама подключалась к...

Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст
Ребят подскажите как сделать: Клиент должен отправить файл на сервер. Сервер его обработать и отправить клиенту текст(1 строка). Как...

Клиент-сервер в один клик!(элемет сервер, клиент)
Вот решил поделиться с вами своей идеей и её реализацией. Всегда написание Сервера и Клиента к нему занимало много времени. Сначала хотел...

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит копию сокета и всякую инфу клиента, и...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что сервер(клиент) не отвечает в течении...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru