bitmap格式分析
我们来看看位图文件(*.BMP)的格式。
位图文件主要分为如下3个部分:
块名称
|
对应Windows结构体定义
|
大小(Byte)
|
文件信息头
|
BITMAPFILEHEADER
|
14
|
位图信息头
|
BITMAPINFOHEADER
|
40
|
RGB颜色阵列
|
BYTE*
|
由图像长宽尺寸决定
|
1、 文件信息头BITMAPFILEHEADER
结构体定义如下:
typedef struct tagBITMAPFILEHEADER { /* bmfh */
UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
bfType
|
说明文件的类型,该值必需是0x4D42,也就是字符'BM'。
|
bfSize
|
说明该位图文件的大小,用字节为单位
|
bfReserved1
|
保留,必须设置为0
|
bfReserved2
|
保留,必须设置为0
|
bfOffBits
|
说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
|
2、位图信息头BITMAPINFOHEADER
结构体定义如下:
typedef struct tagBITMAPINFOHEADER { /* bmih */
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
其中:
biSize
|
说明BITMAPINFOHEADER结构所需要的字数。
|
biWidth
|
说明图象的宽度,以象素为单位。
|
biHeight
|
说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。
|
biPlanes
|
为目标设备说明位面数,其值将总是被设为1。
|
biBitCount
|
说明比特数/象素,其值为1、4、8、16、24、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。
|
biCompression
|
说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB。
|
biSizeImage
|
说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0。
|
biXPelsPerMeter
|
说明水平分辨率,用象素/米表示。
|
biYPelsPerMeter
|
说明垂直分辨率,用象素/米表示。
|
biClrUsed
|
说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。
|
biClrImportant
|
说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
|
3、RGB颜色阵列
有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:
蓝色B值
|
绿色G值
|
红色R值
|
对于32位的RGB位图像素数据格式是:
蓝色B值
|
绿色G值
|
红色R值
|
透明通道A值
|
透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。
行对齐
由于Windows在进行行扫描的时候最小的单位为4个字节,所以当
图片宽 X 每个像素的字节数 != 4的整数倍
时要在每行的后面补上缺少的字节,以0填充(一般来说当图像宽度为2的幂时不需要对齐)。
注意:
bmp文件的RGB数据第一行表示的是LCD最后一行的数据