Bitmap.Save(Stream,ImageFormat)如何格式化数据?

时间:2010-04-07 10:44:51

标签: c# .net bitmap byte

我有一个非透明的彩色位图,长度为2480,宽度为3507。

使用Bitmap.GetPixel(int x, int y)我能够获取位图中每个像素的颜色信息。

如果我将位图喷射到byte []:

MemoryStream ms = new MemoryStream();
bmp.Save(ms, ImageFormat.Bmp);
ms.Position = 0;
byte[] bytes = ms.ToArray();

然后我希望有相同的信息,即我可以转到字节[1000]并读取该像素的颜色信息。

事实证明,我的字节数组比我预期的要大。我以为我会得到一个2480 x 3507 = 8697360元素的数组。相反,我得到一个包含8698438个元素的数组 - 我认为是某种标题。

我的数组中的字节以什么格式存储?是否有一个1078字节长的标题,后跟每个字节元素的Alpha,Red,Green,Blue值,还是其他什么?

我需要的只是每个像素的颜色信息。我不关心标题(或确实是透明度),除非我需要它来获取颜色信息。

2 个答案:

答案 0 :(得分:3)

你正在调用返回基础字节数组的GetBuffer - 它大于流的实际长度。

使用

byte[] bytes = ms.ToArray();

使用GetBuffer但与ms.Length结合使用。

话虽如此,你将它保存为BMP - 所以也会有标题信息;它不像第一个字节将代表第一个像素。不幸的是,据我所知,没有“原始”图像格式......这听起来像你真正想要的。

您可以使用Bitmap.LockBits,然后根据需要复制数据......

答案 1 :(得分:0)

如果我正确理解了有关Bitmap.Save的文档,它会以指定的格式保存图像,这意味着您将在bytes数组中使用位图标头。我想您应该阅读一些关于bitmap format的文档,以了解如何在数组中获取所需信息