图象文件格式
BMP文件由四部分组成:文件头,图象控制信息,调色板信息(或者掩码信息)和位图点阵。
1.位图文件头:包含有关于文件类型、文件大小、存放位置等信息
结构如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; //文件类型
DWORD bfSize; //文件的字节数
WORD bfReserved1; //保留
WORD bfReserved2; //保留
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
其中:
(1)WORD bfType 用于表示文件类型,如果它是bmp文件,那么它这个位置的值一定是”BM” 也就是0x4D42。
(2)DWORD bfSize: 表示整个文件的字节数
(3)WORD bfReserved1: 保留
(4)WORD bfReserved2: 保留
(5)DWORD bfOffBits: 表示位图的数据信息离文件头的偏移量,以字节为单位
2.图象控制信息:包含位图文件的大小、压缩类型和颜色格式等信息
结构如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //表示本结构的大小
LONG biWidth; //位图的宽度
LONG biHeight; //位图的高度
WORD biPlanes; //永远为1 , 附msdn解释
//Specifies the number of planes for the target device. This value must be set to 1.
WORD biBitCount;//位图的位数 分为1 4 8 16 24 32
DWORD biCompression;
DWORD biSizeImage; //表示位图数据区域的大小以字节为单位
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
其中:
(1)DWORD biSize: 说明BITMAPINFOHEADER结构所需要的字数。注:这个值并不一定是BITMAPINFOHEADER结构的 尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,
或是sizeof(BITMAPV5HEADER)的值。这要根据该位图文件的格式 版本来决定,不过,就现在的情况来看,绝大多数的BMP图像都是BITMAPINFOHEADER结构的。
(2)LONG biWidth: 说明图象的宽度,以象素为单
(3)LONG biHeight; 说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位 图,
还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,
高度值是一个正数。(注:当高度值是一个负数时(正向图像),
(4)biCompression图像将不能被压缩(也就是说
(5)WORD biPlanes; 为目标设备说明位面数,其值将总是被设为1
(6)WORD biBitCount; 说明比特数/象素,其值为1、4、8、16、24、或32
(7)DWORD biCompression; 说明图象数据压缩的类型。其值可以是下述值之一:
a. BI_RGB:没有压缩
b. BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
c. BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成
d. BI_BITFIELDS:每个象素的比特由指定的掩码决定。
(8)DWORD biSizeImage; 说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0
(9)LONG biXPelsPerMeter; 说明水平分辨率,用象素/米表示
(10)LONG biYPelsPerMeter; 说明垂直分辨率,用象素/米表示
(11)DWORD biClrUsed; 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)
(12)DWORD biClrImportant; 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。
3. 调色板或者掩码
如果是8位位图 则存放调色板 ;16 与32位 位图则存放RGB颜色的掩码,这些掩码以DWORD大小来存放。
RGBQUAD结构描述由R、G、B相对强度组成的颜色,定义如下:
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
其中:
rgbBlue: 指定蓝色强度
rgbGreen: 指定绿色强度
rgbRed: 指定红色强度
rgbReserved: 保留,设置为0
4. 位图点阵数据
图象的每一扫描行由表示图象象素的连续的字节组成,每一行的字节数取决于图象的颜色数目和用象素表示的图象宽度。扫描行 是由底向上存储的,这就是说,
阵列中的第一个字节表示位图左下角的象素,而最后一个字节表示位图右上角的象素。
(只针对与倒向DIB,如果是正向DIB, 则扫描行是由顶向下存储的),倒向DIB的原点在图像的左下角,
而正向DIB的原点在图像的左上角。同时,每一扫描行的字节数必需是4的整倍数,也就是 DWORD对齐的。