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

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

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

Задача такая: Захватить видео с вебкамеры на программе-сервере, добавить в последние биты каждого пикселя, биты какого либо файла, принять видео на клиенте, с возможностью сохранить отправленный с сервера файл. Проблема такая: сильно теряется качество bitmap (перед отправкой ~ 600Кб, после принятия ~ 30Кб). Отправляю и принимаю byte массив. Отправляю с сервера:
    ...
    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;
        }
Пробовал сохранять изображение перед отправкой и сразу как получили, кадры абсолютно одни и те же, но на приеме кадр внешне хуже качества. Не понимаю как такое вообще может быть т.к. отправляю и принимаю byte[]. Изображение перед отправкой действительно хранит выбранный файл, после приема естественно считать не получается. Так же в кадре который содержит файл закрашиваю пиксел(0,0) черным, но на приеме он так же теряет этот цвет, т.е. внешне он кажется так же черным но по факту ~ RGB(11, 14, 9)

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

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

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


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

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

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