lecoyote | Code :
- void CreateBMPFile(HWND hwnd, LPTSTR pszFile, PBITMAPINFO pbi,
- HBITMAP hBMP, HDC hDC)
- {
- HANDLE hf; // file handle
- BITMAPFILEHEADER hdr; // bitmap file-header
- PBITMAPINFOHEADER pbih; // bitmap info-header
- LPBYTE lpBits; // memory pointer
- DWORD dwTotal; // total count of bytes
- DWORD cb; // incremental count of bytes
- BYTE *hp; // byte pointer
- DWORD dwTmp;
- pbih = (PBITMAPINFOHEADER) pbi;
- lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
- if (!lpBits)
- errhandler("GlobalAlloc", hwnd);
- // Retrieve the color table (RGBQUAD array) and the bits
- // (array of palette indices) from the DIB.
- if (!GetDIBits(hDC, hBMP, 0, (WORD) pbih->biHeight, lpBits, pbi,
- DIB_RGB_COLORS))
- {
- errhandler("GetDIBits", hwnd);
- }
- // Create the .BMP file.
- hf = CreateFile(pszFile,
- GENERIC_READ | GENERIC_WRITE,
- (DWORD) 0,
- NULL,
- CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL,
- (HANDLE) NULL);
- if (hf == INVALID_HANDLE_VALUE)
- errhandler("CreateFile", hwnd);
- hdr.bfType = 0x4d42; // 0x42 = "B" 0x4d = "M"
- // Compute the size of the entire file.
- hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
- pbih->biSize + pbih->biClrUsed
- * sizeof(RGBQUAD) + pbih->biSizeImage);
- hdr.bfReserved1 = 0;
- hdr.bfReserved2 = 0;
- // Compute the offset to the array of color indices.
- hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
- pbih->biSize + pbih->biClrUsed
- * sizeof (RGBQUAD);
- // Copy the BITMAPFILEHEADER into the .BMP file.
- if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
- (LPDWORD) &dwTmp, NULL))
- {
- errhandler("WriteFile", hwnd);
- }
- // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
- if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
- + pbih->biClrUsed * sizeof (RGBQUAD),
- (LPDWORD) &dwTmp, ( NULL))
- errhandler("WriteFile", hwnd);
- // Copy the array of color indices into the .BMP file.
- dwTotal = cb = pbih->biSizeImage;
- hp = lpBits;
- if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL))
- errhandler("WriteFile", hwnd);
- // Close the .BMP file.
- if (!CloseHandle(hf))
- errhandler("CloseHandle", hwnd);
- // Free memory.
- GlobalFree((HGLOBAL)lpBits);
- }
|
|