设备无关位图(Device Independent Bitmap) 有 Window 和 OS/2 两种格式,这两种格式大致相仿。
位图文件头结构 BITMAPFILEHEADER |
位图信息头结构 BITMAPINFOHEADER |
位图颜色表 RGBQUAD |
位图象素数据 |
三个头结构在 windows.h 中定义如下:
typedef struct tagBITMAPFILEHEADER
{
UINT bfType; // 字节 "BM"
DWORD bfSize; // 文件总字节数
UINT bfReserved1; // 0
UINT bfReserved2; // 0
DWORD bfoffBits; // 位图数据文件据文件头的偏移量
} BITMAPFILEHEADER;
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // 本结构大小的字节数
LONG biWidth; // 位图宽度,象素单位
LONG biHeight; // 位图高度,象素单位
WORD biPlanes; // 1
WORD biBitCount; // 位图象素的位数,可为 1(2 色)、4(16 色)、8(256 色)、24(真色彩)
DWORD biCompression; // 压缩方式, 0 不压缩
DWORD biSizeImage; // 位图数据字节数
LONG biXPelsPerMeter; // 水平分辨率,象素点每米
LONG biYPelsPerMeter; // 垂直分辨率,~
DWORD biClrUsed; // 不为 0 表示图像中使用的颜色数,即颜色表的表项数;
// 为 0 表示颜色表是满的,即表项个数为 (2^象素位数) 个
DWORD biClrImportant; // 图像中重要的颜色数
} BITMAPINFOHEADER;
typedef struct tagRGBQUAD
{
BYTE regBlue; // 蓝色比例
BYTE rgbGreen; // 绿色比例
BYTE rgbRed; // 红色比例
BYTE rgbReserved; // 0
} RGBQUAD;
24 位位图颜色表为空,不使用调色板,其象素值就是颜色值;颜色表一般将重要的颜色放在前面。对 4 位或 8 位位图,可以采用 RLE(游程长度编码) 压缩,分别称为 RLE4 和 RLE8 位图。
位图数据紧跟在颜色表后面,以行位单位存储,每行都被填充到一个 4 字节边界,即每行所占的存储长度总是 4 字节(32 位)的倍数,不足时用 0 填充。
位图行的存储顺序是颠倒的,即位图文件中第一行数据对应的是位图的最底行。
1 位象素的位图,每个象素占一位,一个字节存储 8 个象素,字节的高位对应最左边的象素。
4 位象素的位图没压缩时一字节存储 2 个象素,高四位对应最左边的象素。
4 位象素的位图采用 RLE 压缩时由一系列组来组成,有三种类型的组:重复组、文字组、特殊组。
8 位象素的位图没有压缩时一字节存储一个象素。
8 位象素的位图采用 RLE 压缩也由同样的三种类型组构成。
24 位象素的位图每象素占三字节,从左到右的每一字节分别存储蓝、绿、红的颜色值。
OS/2 DIB 和 Windows DIB 只有位图信息头结构和颜色表结构(第 2 、3 两项)不同,它们的存储方式是一样的。 OS/2 中的定义如下:
typedef struct tagBITMAPCOREINFO
{
BITMAPCOREHEADER bmciHeader;
RGBTRIPLE bmciColors[1];
} BITMAPCORE;
typedef struct tagBITMAPCOREHEADER
{
DWORD bcSize; // 本结构大小的字节数
WORD bcWidth; // 位图宽度,象素单位
WORD bcHeight; // 位图高度,象素单位
WORD bcPlanes; // 1
WORD bcBitCount; // 位图象素的位数,可为 1(2 色)、4(16 色)、8(256 色)、24(真色彩)
} BITMAPCOREHEADER;
typedef struct tagRGBTRIPLE
{
BYTE rgbtBlue;
BYTE rgbtGreen;
BYTE rgbtRed;
} RGBTRIPLE;