C# &引用;“人工制品”;在c中对图像进行流式处理时#

C# &引用;“人工制品”;在c中对图像进行流式处理时#,c#,image,stream,artifacts,C#,Image,Stream,Artifacts,我想创建一个通过网络传输多个图像的项目。我只是想从小的、功能性的代码开始,但我已经遇到了一个棘手的问题。图像已被接收,但它包含图形错误,例如它只是图像的一部分 遗憾的是,由于RPUTION低,无法显示图像,这里是链接。 当然,答案是100万美元^^ TcpListener listener; TcpClient client; TcpClient datatoclient; NetworkStream stream; 主机部分: listener = new TcpListener(5000

我想创建一个通过网络传输多个图像的项目。我只是想从小的、功能性的代码开始,但我已经遇到了一个棘手的问题。图像已被接收,但它包含图形错误,例如它只是图像的一部分

遗憾的是,由于RPUTION低,无法显示图像,这里是链接。

当然,答案是100万美元^^

TcpListener listener;
TcpClient client;
TcpClient datatoclient;
NetworkStream stream;
主机部分:

listener = new TcpListener(5000);
listener.Start();
datatoclient = listener.AcceptTcpClient();
NetworkStream nowystream = datatoclient.GetStream();

MemoryStream ms = new MemoryStream();
byte[] image = File.ReadAllBytes("default.jpg");

switch (trackBar1.Value)
{
      case 0:
          image = File.ReadAllBytes("mirrion.jpg");
          break;
      case 1:
          image = File.ReadAllBytes("tenis.jpg");
          break;
      case 2:
          image = File.ReadAllBytes("marisasold.jpg");
          break;
}


// get the image size in bytes
int numberOfBytes = image.Length;

// put the size into an array
byte[] numberOfBytesArray = BitConverter.GetBytes(numberOfBytes);

// send the image size 
nowystream.Write(numberOfBytesArray, 0, numberOfBytesArray.Length);

// send the image 
nowystream.Write(image, 0, numberOfBytes);
客户部分:

client = new TcpClient("127.0.0.1", 5000);
stream = client.GetStream();

byte[] data = new byte[4];
// read the size
stream.Read(data, 0, data.Length);
int size = BitConverter.ToInt32(data, 0);
label1.Text = size.ToString();

// prepare buffer
data = new byte[size];

// load image
stream.Read(data, 0, data.Length);

// save image to file for test
File.WriteAllBytes("received.jpg", data);

MemoryStream MS = new MemoryStream(data);

pictureBox1.Image = Image.FromStream(MS);

stream.Read
不保证它将读取
数据.Length
字节。相反,它返回读取的字节数。因此,您应该检查其返回值并继续读取,直到获得所有字节

请参阅(部分
返回值

Thr read方法可以是这样的

void Read(Stream stream, byte[] buffer,int offset,int len)
{
    int read = 0;
    while (read < len)
    {
        read += stream.Read(buffer, offset + read, len-read);
    }
}
void Read(流,字节[]缓冲区,int偏移量,int len)
{
int read=0;
while(读
stream.Read
不保证它将读取
数据.Length
字节。相反,它返回读取的字节数。因此,您应该检查其返回值并继续读取,直到获得所有字节

请参阅(部分
返回值

Thr read方法可以是这样的

void Read(Stream stream, byte[] buffer,int offset,int len)
{
    int read = 0;
    while (read < len)
    {
        read += stream.Read(buffer, offset + read, len-read);
    }
}
void Read(流,字节[]缓冲区,int偏移量,int len)
{
int read=0;
while(读
是的,这很有效,非常感谢!我的错,我认为流。读取将等待,直到它读取所有需要的数据。是的,这工作,非常感谢!糟糕的是,我认为stream.Read将等待它读取所有需要的数据。