如何避免位图的字节数组中的标头数据
本文关键字:数据 数组 字节数 何避免 位图 字节 | 更新日期: 2023-09-27 18:24:18
我正在尝试将位图图像转换为C#中的字节数组。但根据位图格式,前12个字节将被赋予位图标头。
// Converting the bitmap image data to byte array
byte[] bitmapFileData = System.IO.File.ReadAllBytes(bitmapImageFilePath);
我调试了这段代码,但对于我给定的单色位图图像,前56个字节填充了一些其他数据,从那时起,它以(0,0,255255255255255……)开头。由于其单色位图图像,字节数组仅包含RGB(0,0,0255和255255255255)。
我的问题是,如何从字节数组中过滤位图标头,以便将数组的其余部分用作位图数据。我知道位图格式的偏移值会解释。那么字节数组的哪个元素给出了偏移值呢?
如果这是一个基本问题或在不同论坛上讨论,请原谅。我是成像部分的新手,在谷歌上搜索了很多,但没能完全理解。
你能给我提供所需的信息吗。
目的:1.将位图图像转换为二进制数据2.更多地了解图像格式的东西
我使用的位置:1.在其中一台打印机中打印给定的位图图像,该打印机将获取图像的十六进制字符串或二进制数据。
根据位图存储,该文件包含一个BITMAPFILEHEADER和一个BITMAPINFOHEADER。BITMAPFILEHEADER
包含一个字段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
对象。
为什么不将其作为位图打开并从那里转换if?
using(Stream BitmapStream = System.IO.File.Open(fileName,System.IO.FileMode.Open ))
{
Image img = Image.FromStream(BitmapStream);
mBitmap=new Bitmap(img);
//...do whatever
}
这篇文章讨论了将图像转换为字节数组
将位图转换为字节数组