在 C# 中流式传输图像时"Artifacts"



我想创建一个通过网络流式传输多个图像的项目。我只是想从小的功能代码开始,但已经遇到了一个对我来说很奇怪的问题。图像被接收,但它包含图形错误,就像它只是它的一部分。

遗憾的是不能显示图片,因为低声誉,这里是链接。http://img543.imageshack.us/img543/1508/buggedy.jpg

当然,一百万美元来换答案。^ ^

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不保证它将读取data.Length字节。相反,它返回读取的字节数。所以你应该检查它的返回值并继续读取,直到你得到所有的字节。

参见http://msdn.microsoft.com/en-us/library/system.io.stream.read(v=vs.90).aspx (Section Return Value)

它的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);
    }
}

相关内容

  • 没有找到相关文章

最新更新