从c#中的byte 创建映像时参数无效错误
我试图在c#中将byte[]
转换为Bitmap
。 以下是代码:
MemoryStream ms = new MemoryStream(b); Bitmap bmp = new Bitmap(ms);
它显示错误创建Bitmap
时Parameter 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 }