一、DIB內的位元影像基本上沒有經過任何壓縮。
DIB的副檔名是.BMP或者.DIB
與大多數位元影像格式不同的是,DIB從底部開始,水平向上掃描圖片。
JPEG,GIF 是壓縮後的DIB。
二、位元影像操作:
1,開啟位元影像
hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;
2,讀取位元影像
dwFileSize = GetFileSize (hFile, &dwHighSize) ;
pbmfh = malloc (dwFileSize) ;
ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
3,讀取位元影像資訊
static BITMAPINFO * pbmi ;
static BYTE * pBits ;
pbmi = (BITMAPINFO *) (pbmfh + 1) ;
pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ;
if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib = pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
}
4,顯示位元影像:
SetDIBitsToDevice (hdc,
100, // xDst
100, // yDst
cxDib, // cxSrc
cyDib, // cySrc
0, // xSrc
0, // ySrc
0, // first scan line
cyDib, // number of scan lines
pBits,
pbmi,
DIB_RGB_COLORS) ;
SetDIBitsToDevice沒有掩碼參數
如果位元影像過大,可以採取連續顯示方法,就是每次讀一行或幾行,然後SetDIBitsToDevice顯示出來,例子見seqdisp。
StretchDIBits (hdc, 0, 0, cxClient, cyClient,
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
StretchDIBits和SetDIBitsToDevice的關係等同與Bitblt和StretchBlt的關係。但StretchDIBits有掩碼參數。
另外StretchDIBits不能通過連續顯示節省記憶體。
5,儲存位元影像
hFile = CreateFile (pstrFileName, GENERIC_WRITE, 0, NULL,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
WriteFile (hFile, pbmfh, pbmfh->bfSize, &dwBytesWritten, NULL) ;
三、DIB和DDB轉化
1,從DIB 到 DDB
1.1 如上面,用ReadFile開啟DIB後,hBitmap = CreateDIBitmap (hdc, (BITMAPINFOHEADER *) (pbmfh + 1),CBM_INIT,
(BYTE *) pbmfh + pbmfh->bfOffBits,(BITMAPINFO *) (pbmfh + 1),DIB_RGB_COLORS) ;
如果CreateDIBitmap的時候沒有初始化像素位,可以用SetDIBits
1.2 CreateDIBSection 建立位元影像的一部分:位元影像像素位的記憶體塊 bits
建立的記憶體塊歸系統所有,傳輸速度快,能用指標直接改變DIB位。deleteobject(hbitmap)的時候系統自動釋放記憶體塊。
步驟:同上,讀取pbmi後,
CreateDIBSection (NULL, pbmi, DIB_RGB_COLORS, &pBits, NULL, 0) ;
ReadFile (hFile, pBits, bmfh.bfSize - bmfh.bfOffBits, &dwBytesRead, NULL) ;
2 從DDB到DIB
GetDIBits
但此方法一般不用,因為如果有HBITMAP控制代碼的話,一定會有建立這個控制代碼的資源。而DDB包含的資訊會比較少,所以不如直接從資源中儲存。