Клиент - сервер. Пересылка Bitmap - C#
Формулировка задачи:
Задача такая: Захватить видео с вебкамеры на программе-сервере, добавить в последние биты каждого пикселя, биты какого либо файла, принять видео на клиенте, с возможностью сохранить отправленный с сервера файл.
Проблема такая: сильно теряется качество bitmap (перед отправкой ~ 600Кб, после принятия ~ 30Кб). Отправляю и принимаю byte массив.
Отправляю с сервера:
Принимаю на клиенте:
Пробовал сохранять изображение перед отправкой и сразу как получили, кадры абсолютно одни и те же, но на приеме кадр внешне хуже качества. Не понимаю как такое вообще может быть т.к. отправляю и принимаю byte[]. Изображение перед отправкой действительно хранит выбранный файл, после приема естественно считать не получается.
Так же в кадре который содержит файл закрашиваю пиксел(0,0) черным, но на приеме он так же теряет этот цвет, т.е. внешне он кажется так же черным но по факту ~ RGB(11, 14, 9)
... 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(); }
... 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; }
Решение задачи: «Клиент - сервер. Пересылка Bitmap»
textual
Листинг программы
.... receiver.ReceiveBufferSize = 1048576; byte[] bytes = new byte[receiver.ReceiveBufferSize]; ...
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д