- // prepare bitmap:
- BYTE* bitmap_data = NULL;
- HDC hDC = GetDC(NULL);
- HDC memHDC = CreateCompatibleDC(hDC);
- BITMAPINFO* pbmi = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
- memset(pbmi, 0, sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256);
- BITMAPINFO& bmi = *pbmi;
- bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi.bmiHeader.biWidth = desiredWidth;
- bmi.bmiHeader.biHeight = -desiredHeight; // top-down
- bmi.bmiHeader.biPlanes = 1;
- bmi.bmiHeader.biBitCount = 8;
- bmi.bmiHeader.biCompression = BI_RGB;
- bmi.bmiHeader.biSizeImage = (((desiredWidth * bmi.bmiHeader.biBitCount + 31) & ~31) >> 3) * desiredHeight;
- for(int i = 0; i < 256; i++)
- {
- bmi.bmiColors[i].rgbRed = i;
- bmi.bmiColors[i].rgbGreen = i;
- bmi.bmiColors[i].rgbBlue = i;
- bmi.bmiColors[i].rgbReserved = 0;
- }
- HBITMAP bitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&bitmap_data, NULL, NULL);
- ReleaseDC(NULL, hDC);
- DeleteDC(hDC);
- // draw:
- SelectObject(memHDC, bitmap);
- ...
- // prepare bitmap file header:
- BITMAPFILEHEADER bf;
- memset(&bf, 0, sizeof(BITMAPFILEHEADER));
- bf.bfType = MAKEWORD('B', 'M');
- bf.bfOffBits = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSize;
- bf.bfSize = bf.bfOffBits + bmi.bmiHeader.biSizeImage;
- // write bitmap file into the vector:
- std::vector<BYTE> bitmapData;
- bitmapData.insert(bitmapData.end(), (BYTE*)&bf, ((BYTE*)&bf) + sizeof(BITMAPFILEHEADER));
- bitmapData.insert(bitmapData.end(), (BYTE*)&bmi.bmiHeader, ((BYTE*)&bmi.bmiHeader) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
- bitmapData.insert(bitmapData.end(), bitmap_data, bitmap_data + bmi.bmiHeader.biSizeImage);
- // clean up memory:
- DeleteObject(SelectObject(memHDC, bitmap));
- DeleteObject(bitmap);
- ReleaseDC(NULL, memHDC);
- DeleteDC(memHDC);