我试图将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)
它只是表明问题中的示例代码代表实际代码的重要性......
尝试重置流中的当前位置
MemoryStream ms = new MemoryStream(b);
ms.Seek(0, SeekOrigin.Begin);
Bitmap bmp = new Bitmap(ms);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33156 次 |
| 最近记录: |