| 偏移量 | 域的名称 | 大小 | 内容 |
图象文件 头 | 0000h | 文件标识 | 2 bytes | 两字节的内容用来识别位图的类型: ‘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"就行。 |
| 0002h | File Size | 1 dword | 用字节表示的整个文件的大小 |
| 0006h | Reserved | 1 dword | 保留,必须设置为0 |
| 000Ah | Bitmap Data Offset | 1 dword | 从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量 |
| 000Eh | Bitmap Header Size | 1 dword | 位图信息头(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,而是应该从具体的文件中读取这个值。这样才能确保程序的 兼容性。 |
| 0012h | Width | 1 dword | 位图的宽度,以象素为单位 |
| 0016h | Height | 1 dword | 位图的高度,以象素为单位 |
| 001Ah | Planes | 1 word | 位图的位面数(注:该值将总是1) |
| 001Ch | Bits Per Pixel | 1 word | 每个象素的位数 1 - 单色位图(实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这两种颜色) 4 - 16 色位图 8 - 256 色位图 16 - 16bit 高彩色位图 24 - 24bit 真彩色位图 32 - 32bit 增强型真彩色位图 |
| 001Eh | Compression | 1 dword | 压缩说明: 0 - 不压缩 (使用BI_RGB表示) 1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示) 2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示) 3 - Bitfields-位域存放方式(用BI_BITFIELDS表示) |
| 0022h | Bitmap Data Size | 1 dword | 用字节数表示的位图数据的大小。该数必须是4的倍数 |
| 0026h | HResolution | 1 dword | 用象素/米表示的水平分辨率 |
| 002Ah | VResolution | 1 dword | 用象素/米表示的垂直分辨率 |
| 002Eh | Colors | 1 dword | 位图使用的颜色数。如8-比特/象素表示为100h或者 256. |
| 0032h | Important Colors | 1 dword | 指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要 |
调色板数据 | 根据BMP版本的不同而不同 | Palette | N * 4 byte | 调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值: Blue 1字节用于蓝色分量 Green 1字节用于绿色分量 Red 1字节用于红色分量 Reserved 1字节用于填充符(设置为0) |
图象数据 | 根据BMP版本及调色板尺寸的不同而不同 | Bitmap Data | xxx bytes | 该域的大小取决于压缩方法及图像的尺寸和图像的位深度,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可能是实际的RGB值,这将根据图像信息头中的位深度值来决定。 |
像素的每一行也必须是4的倍数
像素的排列是从最低行开始,从左到右,一直到第一行
24位时,每一像素以BGR来组织,每一像素用8位表示
VC中也定义了bmp文件头和信息相关的结构,下面为实现的简洁代码,也可自己定义每一位,以二进制的方式写入文件。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
void SaveImageToBmp(long* pImage, char *filename)
{
BITMAPFILEHEADER bfh;
BITMAPINFOHEADER *pbih=new LPBITMAPINFOHEADER;
FILE *fp;
int length;
//
//Init pbih;
//
fp = fopen(filename, "wb");
if(!fp) return;
bfh.bfSize = length;
bfh.bfType = 0x4d42;
bfh.bfOffBits = 54;
bfh.bfReserved1 = 0;
bfh.bfReserved2 = 0;
fwrite((void *)&bfh, sizeof(BITMAPFILEHEADER), 1, fp);
fwrite((void *)(pImage), 1, length, fp);
fclose(fp);
}