设备相关位图(DDB)与设备无关位图(DIB) 的区别
设备相关位图 DDB(Device-Dependent-Bitmap)
DDB不具有自己的调色板信息,他的颜色模式必须与输出设备相一致。如:在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色板。由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。
设备无关位图DIB(Device-Independent-Bitmap)
DIB具有自己的调色板信息,他可以不依赖系统的调色板。由于他不依赖于设备,所以通常用它来保存文件,如.bmp格式的文件就是DIB.
HBITMAP与BITMAP的区别
BITMAP 是一个结构:
typedef struct tagBITMAP { /* bm */
int bmType;
int bmWidth;
int bmHeight;
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
} BITMAP;
HBITMAP 是一个指向BITMAP的句柄
HBITMAP HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),
"aaa.bmp", IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE);
BITMAP bm;
GetObject(hBmp,sizeof(bm),&bm); 可以通过该函数 由HBITMAP取得BITMAP;
如何通过BITMAP构造一个.bmp格式的文件
LoadImage从磁盘中读取.bmp文件转换成了易于系统操作的HBITMAP文件,但很多时候又需要将BITMAP数据存储下来,如:存储,D3DXCreateTextureFromFileInMemory()需要严格的.bmp格式的数据才行;
构建BITMAPFILEHEADER bfileh; 并填充;构建BITMAPINFOHEADER binfoh并填充;
将上述两者数据和BITMAP.bmBits的数据拷贝到一个缓冲区即可;
memcpy( buffer, sizeof(BITMAPFILEHEADER), bfileh);
memcpy( &buffer[sizeof(BITMAPFILEHEADER)], sizeof(BITMAPINFOHEADER), binfoh);
memcpy( &buffer[sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)], 图形数据区字节长度, bitmap.bmBits);
其他一些DIB,DDB有用的函数:
GetDIBits(); // 获取HBITMAP的自定数据区,要自己拿个空间去接受这些数据;
GetBitmapBits(); // 获取HBITMAP中bitmap的指定数据区
CreateDIBSection(); // 创建一个自定义的位图