Клиент - сервер. Пересылка 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]; ...