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.