im пытается отправить изображение через tcp, он работает около 50% времени, остальные 50% просто дают мне черное изображение, и если я отправлю 2 в пространстве, как 3 секунды, он сработает , кто-нибудь знает почему? и как я могу исправить этуОтправка изображения через TCP
Клиент:
while ((i = stream.Read(datalength, 0, 4)) != 0)
{
byte[] data = new byte[BitConverter.ToInt32(datalength, 0)];
stream.Read(data, 0, data.Length);
this.Invoke((MethodInvoker)delegate
{
try
{
Image Screenshot = byteArrayToImage(data);
pictureBox1.Image = Screenshot;
}
catch { }
});
}
Это функция, которая преобразует массив байтов изображения
public Image byteArrayToImage(byte[] byteArrayIn)
{
MemoryStream ms = new MemoryStream(byteArrayIn);
Image returnImage = Image.FromStream(ms);
return returnImage;
}
Сервер:
Bitmap printscreen = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
Graphics graphics = Graphics.FromImage(printscreen as Image);
graphics.CopyFromScreen(0, 0, 0, 0, printscreen.Size);
byte[] data = imageToByteArray(Image);
stream = client.GetStream();
int length = data.Length;
byte[] datalength = new byte[4];
datalength = BitConverter.GetBytes(length);
stream.Write(datalength, 0, 4);
stream.Write(data, 0, data.Length);
Это функция который преобразует изображение в байтовый массив
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
Вы хотите просто заменить «stream.Read (data, 0, data.Length)»; с вашим кодом? или "while ((i = stream.Read (datalength, 0, 4))! = 0)"? спасибо за помощь –
@RachelDockter: Замените 'stream.Read (data, 0, data.Length);' yes. Код будет запрашивать столько байтов, сколько ему не хватает, поэтому, если вы, например, получили все, кроме одного байта, он запросит только один байт. –
@RachelDockter: Если это работает, отметьте это как принятый ответ, нажав галочку слева от сообщения. –