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

Узнай цену своей работы

Формулировка задачи:

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

Решение задачи: «Клиент - сервер. Пересылка Bitmap»

textual
Листинг программы
  1. ....
  2.                         receiver.ReceiveBufferSize = 1048576;
  3.                         byte[] bytes = new byte[receiver.ReceiveBufferSize];
  4. ...

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут