bool SaveBMP(HDC hdc, const tstring& filePath)
{
HBITMAP hbm = (HBITMAP)GetCurrentObject(hdc, OBJ_BITMAP);
assert(hbm);
return SaveBMP(hbm, filePath);
}
bool SaveBMP(HBITMAP hbm, const tstring& filePath)
{
LPBYTE pBitmap = NULL;
bool bAlloc = false;
BITMAP bm = {0};
assert(GetObject(hbm, sizeof(BITMAP), &bm));
assert(bm.bmWidth && bm.bmHeight);
if (!bm.bmBits)
{
LONG size = bm.bmWidthBytes * bm.bmHeight;
pBitmap = new BYTE[size];
bAlloc = true;
assert(GetBitmapBits(hbm, size, pBitmap) == size);
} else
{
pBitmap = (LPBYTE)bm.bmBits;
}
BITMAPFILEHEADER bfh = {0};
bfh.bfType = 0x4d42;
bfh.bfSize = bm.bmWidthBytes * bm.bmHeight + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
BITMAPINFO bmi = {0};
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = bm.bmWidth;
bmi.bmiHeader.biHeight = - bm.bmHeight;
bmi.bmiHeader.biPlanes = bm.bmPlanes;
bmi.bmiHeader.biBitCount = bm.bmBitsPixel;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = bm.bmWidthBytes * bm.bmHeight;
bmi.bmiHeader.biXPelsPerMeter = 0;
bmi.bmiHeader.biYPelsPerMeter = 0;
bmi.bmiHeader.biClrUsed = 0;
bmi.bmiHeader.biClrImportant = 0;
FILE *fp = NULL;
_tfopen_s(&fp, filePath.c_str(), _T("wb"));
assert(fp);
size_t writeCount = fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, fp);
assert(writeCount == 1);
writeCount = fwrite(&bmi, sizeof(BITMAPINFOHEADER), 1, fp);
assert(writeCount == 1);
writeCount = fwrite(pBitmap, bmi.bmiHeader.biSizeImage, 1, fp);
assert(writeCount == 1);
fclose(fp);
if (bAlloc && pBitmap)
delete [] pBitmap;
return true;
}
需要注意的地方:
1)得到HDC的bitmap的时候,不要使用SelectObject来得到,这样更加复杂,并且SelectObject只能够得到memory dc的bitmap.
2)GetObject的时候,只有在HBITMAP是由CreateDIBSection返回的handle,BITMAP结构体当中的内容指针biBits才会为非零,否则的话需要再次使用GetBitmapBits函数来得到相应的bitmap buffer.