【问题标题】:bytes to image converting error字节到图像转换错误
【发布时间】:2011-05-07 17:17:29
【问题描述】:

正在创建客户端服务器应用程序 并且客户端会向服务器请求某个图像,服务器会发送给客户端

客户端收到后会在图片框中显示

这是我的代码

string line = null;
            line = textBox3.Text;
            socket.Send(Encoding.ASCII.GetBytes(line)); 
            data = new byte[1024];
            dataSize = socket.Receive(data);
            //string s = Encoding.ASCII.GetString(data, 0, dataSize);
            //           textBox4.Text = s;
            Image newImage;
            using (MemoryStream ms = new MemoryStream(data,0,dataSize)) 
            { 

                ms.Write(data,0,dataSize); 

                newImage = Image.FromStream(ms,true); //HERE I GOT THE PROBLEM

            }


            pictureBox1.Image = newImage;
        }

然后它返回一个错误,称为参数无效,所以我不知道这里有什么问题?

【问题讨论】:

  • "It" 根本不会“返回”错误。里面的东西抛出了异常,你应该做的第一件事就是找出是哪个函数抛出了异常。除非您这样做,否则可能会浪费数小时查看错误的代码。

标签: c# image stream byte


【解决方案1】:

您的网络代码在两个方面存在缺陷:

1) 如果数据大于 1024 字节,则根本不起作用
2)如果传入的数据碎片化,则中断(一个发送调用不映射到一个接收调用)。 TCP 不是基于数据包的流协议。

要修复它首先写入图像的字节大小,并在读取时读取直到你有足够的字节,然后才从字节构造图像。

【讨论】:

    【解决方案2】:

    很难相信图片的大小小于 1KB。有更大的缓冲区:

     data = new byte[1024 * 500]; //limit to 500KB
    

    缓冲区小于图像的实际大小可能会导致数据不完整,这确实是图像的无效流。

    【讨论】:

    • 这仍然无法正常工作,因为 TCP 是基于流而不是基于数据包的协议。
    【解决方案3】:

    你需要在写入后将内存流的位置重置回开始:

    ...
    ms.Write(data,0,dataSize); 
    ms.Position = 0;
    newImage = Image.FromStream(ms,true); //HERE I GOT THE PROBLEM
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      相关资源
      最近更新 更多