如何将JPEG格式的数组转换为位图

4

我有一个在c#/.net中运行的应用程序,目前可以从一组嵌入式相机接收bayer格式的原始图像数据并将其转换为jpeg图像。为了节省传输时间,我修改了嵌入式设备,使其在传输之前将图像编码为jpeg格式。我是一名经验丰富的嵌入式程序员,但对c#/.net完全不熟悉。我已经成功地修改了应用程序,使用以下代码片段将数组保存到文件中并使用jpeg名称(偏移量5是跳过传输帧中的头数据):

FileStream stream = File.Create(fileName);
BinaryWriter writer = new BinaryWriter(stream);
writer.Write(multiBuff.msgData, 5, multiBuff.dataSize - 5);
writer.Close();

这些文件可以正常打开,但是现在我想将数据作为位图处理,而不必保存并从文件加载。我尝试在数据数组上执行以下操作:

MemoryStream stream = new MemoryStream(data);
BinaryReader reader = new BinaryReader(stream);
byte[] headerData = reader.ReadBytes(5);
Bitmap bmpImage = new Bitmap(stream);

但是这会抛出一个参数无效的异常。作为新手,我对所有涉及图像的类和方法都有点不知所措,而且看起来我正在做的事情应该很普遍,但我在通常的地方找不到任何示例。有什么想法吗?


1
假设字节流正确,这应该可以工作。不清楚multiBuff.msgData如何变成data。这是一种异常情况。 - Hans Passant
3个回答

2

我认为你正在寻找Bitmap.FromStream()方法:

Bitmap bmpImage = (Bitmap)Bitmap.FromStream(stream);

实际上使用new Bitmap(stream)也应该可以工作 - 这意味着流中的数据不构成有效的图像 - 您确定这个jpg文件是有效的吗?您能将其保存到磁盘并在Paint中打开以进行测试吗?


这个可以工作,但是你必须添加一个 Bitmap 的显式转换。花了我一段时间来测试,因为我不得不追踪代码中深处的有趣偏移量。 - MattTheCodeMonkey

1

你使用 Image 类。

Image image;
using (MemoryStream stream = new MemoryStream(data))
{
    image = Image.FromStream(stream);
}

我认为这个会起作用,因为Bitmap只是Image的一个特例(至少在我看来是这样的)。 - MattTheCodeMonkey

0

顺便提一下,它没有起作用是因为reader.ReadBytes(5)返回流的前5个字节而不是位置5后面的字节。


这不是错误 - 它应该读取前5个字节,以便位图可以读取流的其余部分,请参见OP问题中的问题定义:偏移量为5是为了跳过传输帧中的标头数据 - BrokenGlass
这就是我要说的。如果他写成 stream.Position = 5; byte[] headerData = reader.ReadBytes(); 就能够运行了。或者是我漏掉了什么?不过使用 FromStream 的其他解决方案更好。 - Sébastien Nussbaumer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接