一.位图格式
Windows中的位图有两种格式:一种被称为设备相关图(Device Depend Bitmap,DDB),另一种被称为设备无关图(Device Independ Bitmap,DIB)
二.DDB位图
DDB位图又称为GDI(Graphics Device Interface,图形设备接口)位图.
在WinSDK中用HBITMAP表示,在MFC中用CBitmap表示,它是一种和设备相关的数据(内存读取)
三.DIB位图
一个DIB位图文件分为4个部分: BITMAPFILEHAEDER BITMAPINFOHEADER 调色板数据和实际的图像数据
与DDB不同的是DIB字节数组是从图像的最下面一行开始逐行向上存储的,也就是把图像倒过来然后逐行扫描,另外字节数组中每个扫描行的字节数必须是4的倍数,如果不足需要0补齐
1.BITMAPFILEHEADER文件头
该结构体固定长度为14个字节
typedef struct tagBITMAPFILEHEADER{ WORD bfType; //长度2,是否为bmp图像文件 DWORD bfSize; //长度4,指定文件大小,包括整个文件头 WORD bfReserved1; //长度2,保留字节0 WORD bfReserved2; //长度2,保留字节0 DWORD bfOffBits; //长度4,指定从文件头到实际的图像数据的偏移字节数 }BITMAPFILEHEADER;
2.BITMAPINFOHEADER信息头
该结构体固定长度为14字节
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //长度为4,指定该结构体的长度 LONG biWidth; //长度为4,指定图像宽度像素 LONG biHeight; //长度为4,指定图像高度像素 WORD biPlanes; //长度为2,值必须为1,表示1个位面 WORD biBitCount; //长度为2,指定颜色位深度,1(黑白二值图)/4(16色图)/8位(256色图) 16(增强色)/24位(真彩色图)/32位 DWORD biCompression; //长度为4,指定位图是否压缩,BI_RGB表示没有图像压缩 DWORD biSizeImage; //长度为4,指定实际图像数据所占用的字节数 LONG biXPelsPerMeter; //长度为4,指定目标设备的水平分辨率 LONG biYPelsPerMeter; //长度为4,指定目标设备的垂直分辨率 DWORD biClrUsed; //长度为4,表示颜色数 DWORD biClrImportant; //长度为4,0表示图像颜色都重要 }BITMAPINFOHEADER;
3.调色板数据
位深度大于8的DIB不存在调色板数据
typedef struct tagRGBQUAD{ BYTE rgbBlue; //该颜色蓝色分量 BYTE rgbGreen; //该颜色绿色分量 BYTE rgbRed; //该颜色红色分量 BYTE rgbReserved; //保留值0 }RGBQUAD;
4.实际图像数据
对于2色位图,用1位表示一个像素的颜色(0表示黑色,1表示白色),一个字节可以表示8个像素
对于16色图,用4位表示一个像素的颜色(0<=n<=16)
对于24色图,用8位表示一个像素的颜色(0<=n<=256)
对于16位图,用2个字节(WORD)表示一个像素
对于24位图,用3个字节表示一个像素
对于32位图,用4个字节表示一个像素
5.显示DIB图像
MFC是不提供任何对DIB的支持函数,但是WinSDK提供了一些DIB操作函数
GetDIBits //从DDB中获取位图的图像位 SetDIBits //设置DIB位图的图像位,用于将DIB转换为DDB形式 CreateDIBitmap //用指定的DIB来创建DDB,并用DIB信息初始化位图的图像位 SetDIBitmap //直接将DIB位图的图像位输出到设备,用于显示DIB StretchDIBits //将DIB位图映射输出到设备的一个矩形区域,位图可能被缩放 CreateDIBPatternBrush //用DIB位图来创建模式画刷 CreateDIBSection //创建一个可直接写入的DIB GetDIBColorable //获取DIB颜色表 SetDIBColorTable //设置DIB颜色表