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

Vin*_*rya 8 c# image

我试图将a转换byte[]Bitmapc#.以下是代码:

MemoryStream ms = new MemoryStream(b);
Bitmap bmp = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)

Parameter is not valid在创建时显示错误Bitmap.

byte[] b 来自网络流.

但是当我将这个byte []写入文件时,在任何图像查看器中打开此文件都可以完美地运行.以下是将byte []写入文件的代码:

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

我在这里错过了什么?

编辑

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

 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();
Run Code Online (Sandbox Code Playgroud)

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

希望它澄清疑虑.

谢谢

Jon*_*eet 14

好吧,只是为了澄清一点......问题是new Bitmap(ms)要从流的当前位置读取数据 - 如果流当前位于数据的末尾,它将无法读取任何内容,因此问题.

问题声称代码是这样的:

MemoryStream ms = new MemoryStream(b);
Bitmap bmp = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)

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

MemoryStream ms = new MemoryStream();
// Copy data into ms here, e.g. reading from NetworkStream
Bitmap bmp = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)

或者可能:

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);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你需要重新设置位置,否则流的"光标"是在年底的数据,而不是开始.但就个人而言,我更喜欢使用Position属性而不是Seek方法,只是为了简单起见,所以我使用:

MemoryStream ms = new MemoryStream();
// Copy data into ms here, e.g. reading from NetworkStream

// Rewind the stream ready for reading
ms.Position = 0;
Bitmap bmp = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)

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


Alb*_*nbo 7

尝试重置流中的当前位置

MemoryStream ms = new MemoryStream(b);
ms.Seek(0, SeekOrigin.Begin);
Bitmap bmp = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)