gpt4 book ai didi

c# - 在 C# 中从 byte[] 创建图像时参数无效错误

转载 作者:太空狗 更新时间:2023-10-29 18:07:44 26 4
gpt4 key购买 nike

我正在尝试在 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 编写的,正在流式传输此图像。

希望解开疑惑

谢谢

最佳答案

好吧,稍微澄清一下...问题是 new Bitmap(ms) 将从流的当前位置读取数据 - 如果流当前位于数据结束,它无法读取任何内容,因此出现问题。

问题声称代码是这样的:

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

在那种情况下,不需要重置流的位置,因为它已经是 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);

在这种情况下,您确实需要重置位置,否则流的“光标”将位于数据的结尾,而不是开头。然而,就我个人而言,我更喜欢使用 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);

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

关于c# - 在 C# 中从 byte[] 创建图像时参数无效错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5285213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com