如何避免位图的字节数组中的标头数据

时间:2013-07-22 12:55:25

标签: c# bitmap c#-2.0 bitmapimage bitmapdata

我正在尝试将位图图像转换为C#中的字节数组。但是根据位图格式,前12个字节将被赋予位图头。

// Converting the bitmap image data to byte array
 byte[] bitmapFileData = System.IO.File.ReadAllBytes(bitmapImageFilePath);

我调试了这段代码,但是对于我给定的monochorme位图图像,frist 56字节填充了一些其他数据,然后从它开始(0,0,0,255,255,255,255,255 ......)。 由于其单色位图图像,字节数组仅包含RGB(0,0,0,255和255,255,255,255)。

这里我的问题是,如何从字节数组中过滤位图头,以便我可以将数组的其余部分用作位图数据。我知道位图格式的偏移值会解释。那么字节数组的哪个元素给出了偏移值?

请原谅这是一个基本问题还是在不同论坛上讨论过。 我是成像部分的新手并且进行了大量的谷歌搜索,但无法获得完美的理解。

您能否向我提供所需的信息。

意向: 1.将位图图像转换为二进制数据 2.更多地了解图像格式的东西

我使用的地方: 1.在其中一台打印机中打印给定的位图图像,该打印机将采用图像的十六进制字符串或二进制数据。

2 个答案:

答案 0 :(得分:1)

根据Bitmap Storage,该文件包含BITMAPFILEHEADER后跟BITMAPINFOHEADERBITMAPFILEHEADER包含一个字段bfOffBits,它给出位图数据第一个字节的偏移量。所以你应该能够读取文件,找到bfOffBits字段,并使用它来索引数组。

例如:

byte[] imageBytes = File.ReadAllBytes("filename.bmp");
int dataOffset = BitConverter.ToInt32(imageBytes, 10);
int firstPixelValue = imageBytes[dataOffset];

如果您想知道有多少像素,则必须阅读BITMAPINFOHEADER。您可能最好获得pinvoke签名(请参阅pinvoke.net上的BITMAPFILEHEADER)并使用一些不安全的代码来设置指向这些结构的指针,以便它们引用数组中的值。

类似的东西:

BITMAPFILEHEADER* bfh = (BITMAPFILEHEADER*)(&imageBytes[0]);
BITMAPINFOHEADER* bih = (BITMAPINFOHEADER*)(&imageBytes[14]);

也就是说,如果您真的想使用原始数据而不是从文件构造Bitmap对象。

答案 1 :(得分:0)

为什么不将它作为位图打开并从那里转换?

using(Stream BitmapStream = System.IO.File.Open(fileName,System.IO.FileMode.Open ))
    {
         Image img = Image.FromStream(BitmapStream);

         mBitmap=new Bitmap(img);
         //...do whatever
    }

这篇文章讨论了将图像转换为字节数组

Convert a bitmap into a byte array