Клиент - сервер. Пересылка 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];
- ...
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д