起始结构
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //类型名,字符串“BM”,
DWORD bfSize; //文件大小
WORD bfReserved1; //保留字
WORD bfReserved2; //保留字
DWORD bfOffBits; //实际位图数据的偏移字节数,即前三个部分长度之和
} BITMAPFILEHEADER;
对应数据
WORD bfType : 0x4d42
DWORD bfSize:0x16cbe
WORD bfReserved1:0x0
WORD bfReserved2:0x0
DWORD bfOffBits:0x3e
紧跟着是
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //指定此结构体的长度,0x28
LONG biWidth; //位图宽
LONG biHeight; //位图高.为正,表示从下往上存储,左下角是起点。为负,表示从上往下储存,左上角是起点
WORD biPlanes; //平面数,为1
WORD biBitCount //采用颜色位数,可以是1,2,4,8,16,24,32
DWORD biCompression; //压缩方式,可以是0,1,2,其中0表示不压缩
DWORD biSizeImage; //实际位图数据占用的字节数
LONG biXPelsPerMeter; //X方向分辨率
LONG biYPelsPerMeter; //Y方向分辨率
DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数)
DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的
} BITMAPINFOHEADER;
对应数据
DWORD biSize:0x28
LONG biWidth:0x480
LONG biHeight:0x288
WORD biPlanes:0x1
WORD biBitCount:0x1
DWORD biCompression:0x0
DWORD biSizeImage:0x16c80
LONG biXPelsPerMeter:0x0
LONG biYPelsPerMeter:0x0
DWORD biClrUsed:0x0
DWORD biClrImportant:0x0
1位位图有调色板2^1=2个
对应是以下结构的数组
typedef struct tagRGBQUAD {
BYTE rgbBlue; //蓝色
BYTE rgbGreen; //绿色
BYTE rgbRed; //红色
BYTE rgbReserved; //保留值,常用于Alpha透明值
} RGBQUAD;
索引0:(B,G,R,A)=(0x0,0x0,0x0,0x0)
索引1:(B,G,R,A)=(0xff,0xff,0xff,0x0)
之后都是数据区,数据紧密排列,无对齐操作
此1位位图,数据区操作方法:每次取一个字节,此字节的第7位到第0位是读取顺序。
代码实现
由于采用CreateDIBSection可以让微软自带的GDI去解析(包括解码压缩类型),我们需要做的就是定位位图的数据区域就行了。具体实现代码,放在本系列的最后!!!