1. // prepare bitmap:
  2. BYTE* bitmap_data = NULL;
  3. HDC hDC = GetDC(NULL);
  4. HDC memHDC = CreateCompatibleDC(hDC);
  5. BITMAPINFO* pbmi = (BITMAPINFO*) new BYTE[sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256];
  6. memset(pbmi, 0, sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256);
  7. BITMAPINFO& bmi = *pbmi;
  8. bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
  9. bmi.bmiHeader.biWidth = desiredWidth;
  10. bmi.bmiHeader.biHeight = -desiredHeight; // top-down
  11. bmi.bmiHeader.biPlanes = 1;
  12. bmi.bmiHeader.biBitCount = 8;
  13. bmi.bmiHeader.biCompression = BI_RGB;
  14. bmi.bmiHeader.biSizeImage = (((desiredWidth * bmi.bmiHeader.biBitCount + 31) & ~31) >> 3) * desiredHeight;
  15. for(int i = 0; i < 256; i++)
  16. {
  17. bmi.bmiColors[i].rgbRed = i;
  18. bmi.bmiColors[i].rgbGreen = i;
  19. bmi.bmiColors[i].rgbBlue = i;
  20. bmi.bmiColors[i].rgbReserved = 0;
  21. }
  22. HBITMAP bitmap = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&bitmap_data, NULL, NULL);
  23. ReleaseDC(NULL, hDC);
  24. DeleteDC(hDC);
  25. // draw:
  26. SelectObject(memHDC, bitmap);
  27. ...
  28. // prepare bitmap file header:
  29. BITMAPFILEHEADER bf;
  30. memset(&bf, 0, sizeof(BITMAPFILEHEADER));
  31. bf.bfType = MAKEWORD('B', 'M');
  32. bf.bfOffBits = sizeof(BITMAPFILEHEADER) + bmi.bmiHeader.biSize;
  33. bf.bfSize = bf.bfOffBits + bmi.bmiHeader.biSizeImage;
  34. // write bitmap file into the vector:
  35. std::vector<BYTE> bitmapData;
  36. bitmapData.insert(bitmapData.end(), (BYTE*)&bf, ((BYTE*)&bf) + sizeof(BITMAPFILEHEADER));
  37. bitmapData.insert(bitmapData.end(), (BYTE*)&bmi.bmiHeader, ((BYTE*)&bmi.bmiHeader) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256);
  38. bitmapData.insert(bitmapData.end(), bitmap_data, bitmap_data + bmi.bmiHeader.biSizeImage);
  39. // clean up memory:
  40. DeleteObject(SelectObject(memHDC, bitmap));
  41. DeleteObject(bitmap);
  42. ReleaseDC(NULL, memHDC);
  43. DeleteDC(memHDC);