1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
void SaveBmpFile(HWND hwnd, LPSTR file, PBITMAPINFO pbi, HBITMAP hBMP, HDC hDC)
{
std::ofstream hF;
BITMAPFILEHEADER bmfh;
PBITMAPINFOHEADER pbmih;
LPBYTE bits;
DWORD total;
DWORD cB;
BYTE *hP;
pbmih = (PBITMAPINFOHEADER) pbi;
bits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbmih->biSizeImage);
if (!bits)
MessageBox(hwnd, "GlobalAlloc()", "Error", MB_OK);
if (!GetDIBits(hDC, hBMP, 0, (WORD) pbmih->biHeight, bits, pbi, DIB_RGB_COLORS))
MessageBox(hwnd, "GetDIBits()", "Error", MB_OK);
hF.open(file, std::ios::binary);
if (hF.fail())
MessageBox(hwnd, "open()", "Error", MB_OK);
bmfh.bfType = 0x4d42;
bmfh.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbmih->biSize + pbmih->biClrUsed * sizeof(RGBQUAD) + pbmih->biSizeImage);
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
bmfh.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pbmih->biSize + pbmih->biClrUsed * sizeof(RGBQUAD);
hF.write((char*) &bmfh, sizeof(BITMAPFILEHEADER));
if (hF.fail())
MessageBox(hwnd, "write() file header", "Error", MB_OK);
hF.write((char*) pbmih, sizeof(BITMAPINFOHEADER) + pbmih->biClrUsed * sizeof(RGBQUAD));
if (hF.fail())
MessageBox(hwnd, "write() info header", "Error", MB_OK);
total = cB = pbmih->biSizeImage;
hP = bits;
hF.write((char*) hP, (int) cB);
if (hF.fail())
MessageBox(hwnd, "write() data", "Error", MB_OK);
hF.close();
if (hF.fail())
MessageBox(hwnd, "close()", "Error", MB_OK);
GlobalFree((HGLOBAL) bits);
}
|