裝置相關點陣圖(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(); // 建立一個自定義的點陣圖
轉自:http://www.cnblogs.com/Jade2009/archive/2009/05/11/1454263.html