GetDIBits可以用于获取位图的属性,如下:
BITMAPINFO bi;
memset(&bi, 0, sizeof(BITMAPINFO));
bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
HDC hDC = ::GetDC(hWnd);
::GetDIBits(hDC, hBitmap, 0, Bitmap.bmHeight, 0, &bi, DIB_RGB_COLORS);
//第3个参数为0,用于获取位图属性,此时系统将填充一个BITMAPINFO结构。奇怪的是,得到的结果为bi.bmiHeader.biCompression=3L(BI_BITFIELDS),而不是BI_RGB(0L)!然后,我再一次调用GetDIBits函数,以获取DIB数据,如下:
DWORD dwPaletteSize = bi.bmiHeader.biBitCount > 8 ? 0 : sizeof(RGBQUAD) * ((1 << bi.bmiHeader.biBitCount) - 1);
DWORD dwBmBitsSize = ((Bitmap.bmWidth * bi.bmiHeader.biBitCount + 31) & ~31) / 8 * Bitmap.bmHeight;LPBITMAPINFO lpbi = (LPBITMAPINFO) LocalAlloc(LMEM_FIXED, sizeof(BITMAPINFO) + dwPaletteSize + dwBmBitsSize);
*lpbi = bi;
::GetDIBits(hDC, hBitmap, 0, Bitmap.bmHeight,
(LPBYTE)lpbi + sizeof(BITMAPINFO) + dwPaletteSize, lpbi, DIB_RGB_COLORS);
::ReleaseDC(hWnd, hDC);此时如果将lpbi写入文件的话,会有问题(位图最后一行的开始几个象素变花了),如果我在写入文件之前执行如下语句,则问题解决:
lpbi->bmiHeader.biCompression = BI_RGB; //从BI_BITFIELDS改为BI_RGB请问这是为什么?BI_BITFIELDS这种位图类型到底是什么类型?