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

时间:2011-03-12 20:16:47

标签: c# image

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

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

在创建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();

我在这里缺少什么?

修改

以下是导致问题的完整代码

 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编写的,用于传输此图像。

希望它澄清疑虑。

由于

4 个答案:

答案 0 :(得分:14)

好的,只是为了澄清一点......问题是new Bitmap(ms)将从流的当前位置读取数据 - 如果流当前位于数据,它不能读取任何东西,因此问题。

该问题声称代码是这样的:

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

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

MemoryStream ms = new MemoryStream();
// Copy data into ms here, e.g. 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);

在这种情况下,你需要重置位置,因为否则流的“光标”位于数据的 end 而不是start。但就个人而言,我更喜欢使用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);

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

答案 1 :(得分:6)

尝试重置流中的当前位置

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

答案 2 :(得分:0)

试试这样:

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

答案 3 :(得分:0)

如果要处理图像,将显示错误。尝试将其从代码中删除