我想在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编写的,用于传输此图像。
希望它澄清疑虑。
由于
答案 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)
如果要处理图像,将显示错误。尝试将其从代码中删除