Skip to content

Instantly share code, notes, and snippets.

@thinkhy
Created January 18, 2011 03:06
Show Gist options
  • Save thinkhy/783914 to your computer and use it in GitHub Desktop.
Save thinkhy/783914 to your computer and use it in GitHub Desktop.
Create Bitmap File(Win32)
void SaveBitmap(HBITMAP hResult, wstring strBmpFile)
{
BITMAP bmp = {0};
GetObject(hResult, sizeof(BITMAP), &bmp);
BITMAPINFO bmpInfo = {0};
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
bmpInfo.bmiHeader.biHeight = bmp.bmHeight;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = bmp.bmBitsPixel;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = 0;
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
BITMAPFILEHEADER bmpFileHead = {0};
bmpFileHead.bfType = 0x4D42;
bmpFileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + bmp.bmWidthBytes * bmp.bmHeight;
bmpFileHead.bfReserved1 = 0;
bmpFileHead.bfReserved2 = 0;
bmpFileHead.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER);
DWORD dwWritten = 0;
HANDLE fh = CreateFile(strBmpFile.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
WriteFile(fh, (LPSTR)&bmpFileHead, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(fh, (char *)&(bmpInfo.bmiHeader), sizeof(BITMAPINFOHEADER), &dwWritten, NULL);
WriteFile(fh, (char *)bmp.bmBits, bmp.bmWidthBytes * bmp.bmHeight, &dwWritten, NULL);
FlushFileBuffers(fh);
CloseHandle(fh);
}
void SvaeBitmap2(HBITMAP hResult, wstring strBmpFile)
{
BITMAP bmp = {0};
GetObject(hResult, sizeof(BITMAP), &bmp);
int iPalletSize = (bmp.bmPlanes * bmp.bmBitsPixel < 24)? (1 << bmp.bmPlanes * bmp.bmBitsPixel) : 0;
BITMAPFILEHEADER bmpFileHeader = {0};
bmpFileHeader.bfType = 0x4D42;
bmpFileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * iPalletSize + bmp.bmWidthBytes * bmp.bmHeight;
bmpFileHeader.bfReserved1 = 0;
bmpFileHeader.bfReserved2 = 0;
bmpFileHeader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * iPalletSize;
PBITMAPINFO pbmpInfo = (PBITMAPINFO)LocalAlloc(LPTR, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * iPalletSize);
pbmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pbmpInfo->bmiHeader.biWidth = bmp.bmWidth;
pbmpInfo->bmiHeader.biHeight = bmp.bmHeight;
pbmpInfo->bmiHeader.biSizeImage = 0;
pbmpInfo->bmiHeader.biCompression = BI_RGB;
pbmpInfo->bmiHeader.biPlanes = bmp.bmPlanes;
pbmpInfo->bmiHeader.biBitCount = bmp.bmBitsPixel;
pbmpInfo->bmiHeader.biXPelsPerMeter = 0;
pbmpInfo->bmiHeader.biYPelsPerMeter = 0;
pbmpInfo->bmiHeader.biClrUsed = 0;
pbmpInfo->bmiHeader.biClrImportant = 0;
LPRGBQUAD pPallet = &pbmpInfo->bmiColors[0];
for(int i = 0; i < iPalletSize; i++)
{
pPallet[i].rgbBlue = pPallet[i].rgbGreen = pPallet[i].rgbRed = static_cast<BYTE>(i * 255 / (iPalletSize - 1));
pPallet[i].rgbReserved = 0;
}
DWORD dwWritten = 0;
HANDLE fh = CreateFile(strBmpFile.c_str(), GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
WriteFile(fh, (LPVOID)&bmpFileHeader, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
WriteFile(fh, (LPVOID)pbmpInfo, sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * iPalletSize, &dwWritten, NULL);
WriteFile(fh, (LPVOID)bmp.bmBits, bmp.bmWidthBytes * bmp.bmHeight, &dwWritten, NULL);
FlushFileBuffers(fh);
CloseHandle(fh);
LocalFree((HGLOBAL)pbmpInfo);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment