BMP文件分析

来源:互联网 发布:魔兽2.43数据库 编辑:程序博客网 时间:2024/06/05 16:08

1. 位图数据

42 4D 5A 00 00 00 00 00 00 00 36 00 00 00 28 00
00 00 03 00 00 00 03 00 00 00 01 00 18 00 00 00
00 00 24 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 FF FF FF 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 FF FF FF 00 00 00
图像是3×3的,左下和右上两个象素为白色,其余均为黑色

2. 分析过程

42 4D 是BITMAPFILEHEADER结构体的bfType,这两个字节是固定的"BM",表示该文件是bmp文件。
5A 00 00 00 表示bmp文件的大小,是BITMAPFILEHEADER结构体的bfSize,由于内存高低位颠倒,所以文件大小为&H0000005A=90字节。
00 00 是BITMAPFILEHEADER结构体的bfReserved1,无意义。
00 00 是BITMAPFILEHEADER结构体的bfReserved2,无意义。
36 00 00 00 表示DIB数据在文件中的偏移量,是BITMAPFILEHEADER结构体的bfOffBits,由于内存高低位颠倒,所以DIB偏移量为&H00000036=54字节。
BITMAPFILEHEADER结构体结束,总共14字节,下面是BITMAPINFOHEADER结构体。
28 00 00 00 是BITMAPINFOHEADER结构体的biSize,由于内存高低位颠倒,所以BITMAPINFOHEADER结构体大小为&H00000028=40字节。
03 00 00 00 是BITMAPINFOHEADER结构体的biWidth,表示bmp文件的宽度,由于内存高低位颠倒,所以bmp文件宽度为&H00000003=3像素。
03 00 00 00 是BITMAPINFOHEADER结构体的biHeight,表示bmp文件的高度,由于内存高低位颠倒,所以bmp文件高度为&H00000003=3像素。
01 00 是BITMAPINFOHEADER结构体的biPlanes,表示bmp表示的平面数,显然只有一个平面,该值恒为1,由于内存高低位颠倒,所以平面数为&H0001=1。
18 00 是BITMAPINFOHEADER结构体的biBitCount,表示bmp图片的颜色位数,由于内存高低位颠倒,所以颜色位数为&H0018=24位色。
00 00 00 00 是BITMAPINFOHEADER结构体的biCompression,全为0表示图片未压缩。
24 00 00 00 是BITMAPINFOHEADER结构体的biSizeImage,表示DIB数据区的容量大小,由于内存高低位颠倒,所以DIB大小为&H00000024=36字节。
00 00 00 00 是BITMAPINFOHEADER结构体的biXPelsPerMeter,表示图片X轴每米多少像素,可省略不写。
00 00 00 00 是BITMAPINFOHEADER结构体的biYPelsPerMeter,表示图片X轴每米多少像素,可省略不写。
00 00 00 00 是BITMAPINFOHEADER结构体的biClrUsed,表示使用了多少个颜色索引表,这里等于0,没有颜色索引表。
00 00 00 00 是BITMAPINFOHEADER结构体的biClrImportant,表示有多少个重要的颜色,等于0时表示所有颜色都很重要。
BITMAPINFOHEADER结构体结束,总共40字节。
BITMAPFILEHEADER结构体加BITMAPINFOHEADER结构体等于14+40=54,正好满足DIB的偏移量,所以后面就是DIB数据区。
由于从BITMAPINFOHEADER结构体得知bmp图片是24位色,所以一个像素只使用3个字节。
FF FF FF 表示第1个像素颜色,蓝:&HFF,绿:&HFF,红:&HFF。
00 00 00 表示第2个像素颜色,蓝:&H00,绿:&H00,红:&H00。
00 00 00 表示第3个像素颜色,蓝:&H00,绿:&H00,红:&H00。
这是一个3*3像素的图片,前面这3个像素就是图片的最底部的一行,从左到右,因为DIB扫描行是上下颠倒的,但是左右不颠倒。
另外,DIB数据规定,每个扫描行的字节数必须是4字节的整数倍,不足的需补零凑够4字节的整数倍,这里每行的3个像素只有9字节,需补3字节凑够一个扫描行12字节才满足4字节的整数倍,所以接下来的3字节为:
00 00 00 表示第1扫描行填充字节,无意义。
00 00 00 表示第4个像素颜色,蓝:&H00,绿:&H00,红:&H00。
00 00 00 表示第5个像素颜色,蓝:&H00,绿:&H00,红:&H00。
00 00 00 表示第6个像素颜色,蓝:&H00,绿:&H00,红:&H00。
00 00 00 表示第2扫描行填充字节,无意义。
00 00 00 表示第7个像素颜色,蓝:&H00,绿:&H00,红:&H00。
00 00 00 表示第8个像素颜色,蓝:&H00,绿:&H00,红:&H00。
FF FF FF 表示第9个像素颜色,蓝:&HFF,绿:&HFF,红:&HFF。
00 00 00 表示第3扫描行填充字节,无意义。

3. 参考

http://post.baidu.com/f?kz=156478060

原创粉丝点击