2013-07-22 19 views
0

我想将位图图像转换为C#中的字节数组。但是按照位图格式,前12个字节将被提供给位图标题。如何避免位图字节数组的头数据

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

我调试代码,但它为我的给定monochorme位图图像,填充有一些其他数据弗里斯特56个字节和从然后它与起始(0,0,0,255,.... 255255255255 ..)。 由于其单色位图图像的字节数组仅包含RGB(0,0,0,255和255,255,255,255)。

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

请原谅,如果它的基本问题或跨不同论坛讨论。 我是新成像部分,并做了大量的谷歌搜索,但无法得到完美的理解。

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

意向: 1.将位图图像转换为二进制数据 2.获取图像格式的东西多一些理解

如果我使用: 1.在一个打印机打印出给定的位图图像,其将采取图像的十六进制字符串或二进制数据。

回答

0

为什么不把它作为一个位图打开并转换,如果从那里?有关图像转换为字节数组

Convert a bitmap into a byte array

+0

我现在试过了。位图在构建时会对象输入一些内容。在C#中,我找不到Load函数来加载位图图像。我的意图是,如果我们加载位图图像,它会自动过滤位图标题。但我想另一种方式,当我从位图中提取字节数组时,我应该能够借助偏移量值来避免标题信息。这个偏移量值也在字节数组中提到,但我不知道偏移值取哪个位置?如果我以一种错误的方式理解你的评论,你能否详细解释一下。谢谢。 –

+0

我更新了代码,使其更加精确 – BigBadOwl

1

根据Bitmap Storage

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

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

这个帖子谈判,该文件包含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对象。