3:color table 调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
4:位图数据阵列,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用3byte的RGB,而其他的小于24位的使用调色板中颜色索引值。
具体格式如下:
下面是一中bmp格式图片的16进制显示:
那么文件头及位图信息有0x36 Bytes 组成,即是地址 0x0000--0x0035的数据;
<1>、bitmap file heade-位图头信息:偏移量:0x0000,长度:27bytes
0x0000--0x0001: 42 4d 文件标识 这里指示是文件格式为:BM
两字节的内容用来识别位图的类型:
'BM' : Windows 3.1x, 95, NT, ...
'BA' :OS/2 Bitmap Array
'CI' :OS/2 Color Icon
'CP' :OS/2 Color Pointer
'IC' : OS/2 Icon
'PT' :OS/2 Pointer
注:因为OS/2系统并没有被普及开,所以在编程时,你只需判断第一个标识"BM"就行。
0x0002--0x0005: 56 ca 00 00 文件长度 用字节表示的整个文件的大小,这里的文件的16进制的长度是0x00 00 ca 56 BYTES的长度(51798字节长度);(高字节在后)
0x0006--0x0009: Reserved
0x000A--0x000D: 36 00 00 00 : Bitmap Data Offset 位图数据(bitmap data)的偏移量 这里是 0x36;(高字节在后)
<2>、bitmap information heade-位图信息头:偏移量:0x000E,长度由0x0e--0x11 的信息指定;这里是0x28,所以bitmap data 阵列从 0x28 + 0x0e = 0x36 开始;
0x000e--0x0011: 28 00 00 00 : bitmap header size 位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:
28h - Windows 3.1x, 95, NT, ...
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95、98、2000等操作系统中,位图信息头的长度并不一定是28h,因为微软已经制定出了新的BMP文件格式,其中的信息头结构变化比较大,长度加长。
所以最好不要直接使用常数28h,而是应该从具体的文件中读取这个值。这样才能确保程序的兼容性。
0x0012--0x0015: B0 00 00 00 width 位图的宽度,以象素为单位; 这里是:0x00 00 00 b0 = 176
0x0016--0x0019: 62 00 00 00 height 位图的高度,以象素为单位; 这里是:0x00 00 00 62 = 98 ; 故而此bitmap的分辨率是:176 x 98;
0x001a--0x001b: 01 00 planes 位图的位面数(注:BMP的该值将总是1)
0x001c--0x001d: 18 00 bits per pixel 每个象素的位数 这里是 0x18 = 24 bits per pixel,
1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色)
4 - 16 色位图
8 - 256 色位图
16 - 16bit 高彩色位图 ;每个pixel 占用 2bytes 数据 16bit(R5G6B5);
24 - 24bit 真彩色位图 ;每个pixel 占用 3bytes 数据 RGB;
32 - 32bit 增强型真彩色位图;每个pixel 占用 4bytes 数据 xRGB;
0x001e--0x0021: 00 00 00 00 compression 压缩说明:
0 - 不压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
0x0022--0x0025: 20 ca 00 00 bitmap data size 用字节数表示的位图数据的大小。比如是24bpp的:那么就是 分辨率*3 bytes;16bpp(每个像素2bytes)是 分辨率* 2bytes;
0x0026--0x0029: H resolution 用象素/米表示的水平分辨率 ; 这里是无效值
0x002a--0x002d: V resolution 用象素/米表示的垂直分辨率 ; 这里是无效值
0x002e--0x0031: colors 位图使用的颜色数。如8-比特/象素表示为100h或者 256;24bpp的真彩色这里的值无效值;
0x0032--0x00xxxx: impartant colors 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要;(此处的终止长度由"0x000e--0x0011: bitmap header size 的数值来决定的,这里是0x28 那么这里的结束的值是0x0036;" )
0x00xxxx--0x00xxxx: palette : 调色板 这个由"0x000A--0x000D: Bitmap Data Offset"和"0x000e--0x0011: bitmap header size" 的数值公头决定; Bitmap Data Offset 减去 bitmap header size得出此处的长度,偏移量由bitmap header size 决定;这里是24bbpp的真彩色,所以没有此处数据;
0x00xxxx-- end of file: bitmap data : 真正的像素的数据(0x0002--0x0005:File Size 减去 0x000A--0x000D:Bitmap Data Offset 得出的数据),这里是24bpp,故这个数据的长度是 分辨率 * 3bytes;如果是 16bpp 则是:分辨率 * 2bytes;
对于jpeg是格式是一种有损压缩,和bmp的无损数据相比较,图片的数据会有损失,而且这种损失是累加的。
++++++++++++++++++++++++++++++++++++++++++++++++
未完,待续。。。。。。