从c#中的byte 创建映像时参数无效错误

我试图在c#中将byte[]转换为Bitmap 。 以下是代码:

 MemoryStream ms = new MemoryStream(b); Bitmap bmp = new Bitmap(ms); 

它显示错误创建BitmapParameter is not valid

byte[] b来自网络流。

但是当我将这个byte []写入文件,并在任何图像查看器中打开此文件时,效果非常好。 以下是将byte []写入文件的代码:

  var fs = new BinaryWriter(new FileStream("tmp.bmp", FileMode.Create, FileAccess.Write)); fs.Write(b); fs.Close(); 

我在这里想念的是什么?

编辑

这是我的完整代码导致问题

  Socket s = listener.AcceptSocket(); byte[] b = new byte[imgLen]; s.Receive(b); MemoryStream ms = new MemoryStream(b); // now here I am using ms.Seek(0, SeekOrigin.Begin); that fixed my problem. Bitmap bmp = new Bitmap(ms); pictureBox1.Image = bmp; s.Close(); 

我在Form_Load事件上使用此代码,没有什么额外的。 我只是想显示一个在网络上流式传输的图像。 服务器是用Java编写的,用于传输此映像。

希望它澄清疑虑。

谢谢

尝试重置流中的当前位置

 MemoryStream ms = new MemoryStream(b); ms.Seek(0, SeekOrigin.Begin); Bitmap bmp = new Bitmap(ms); 

好的,只是为了澄清一点……问题是new Bitmap(ms)将从流的当前位置读取数据 – 如果流当前位于数据的末尾 ,则不会是能够阅读任何东西,因此问题。

问题声称代码是这样的:

 MemoryStream ms = new MemoryStream(b); Bitmap bmp = new Bitmap(ms); 

在这种情况下, 不需要重置流的位置,因为它已经是0。 但是,我怀疑代码实际上更像是这样:

 MemoryStream ms = new MemoryStream(); // Copy data into ms here, eg reading from NetworkStream Bitmap bmp = new Bitmap(ms); 

或者可能:

 MemoryStream ms = new MemoryStream(b); // Other code which *reads* from ms, which will change its position, // before we finally call the constructor: Bitmap bmp = new Bitmap(ms); 

在这种情况下,您需要重置位置,否则流的“光标”位于数据的末尾而不是开始。 但就个人而言,我更喜欢使用Position属性而不是Seek方法,只是为了简单起见,所以我使用:

 MemoryStream ms = new MemoryStream(); // Copy data into ms here, eg reading from NetworkStream // Rewind the stream ready for reading ms.Position = 0; Bitmap bmp = new Bitmap(ms); 

它只是表明问题中的示例代码代表实际代码的重要性……

试试这样:

 byte[] b = ... using (var ms = new MemoryStream(b)) using (var bmp = Image.FromStream(ms)) { // do something with the bitmap }