void SaveBitmapToFile( BYTE* pBitmapBits, LONG lWidth, LONG lHeight,WORD wBitsPerPixel, LPCTSTR lpszFileName )
{
BITMAPINFOHEADER bmpInfoHeader = {0};
BITMAPFILEHEADER bfh = {0};
HANDLE hFile = NULL;
DWORD dwWritten = 0;
// Set the size
bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
// Bit count
bmpInfoHeader.biBitCount = wBitsPerPixel;
// Use all colors
bmpInfoHeader.biClrImportant = 0;
// Use as many colors according to bits per pixel
bmpInfoHeader.biClrUsed = 0;
// Store as un Compressed
bmpInfoHeader.biCompression = BI_RGB;
// Set the height in pixels
bmpInfoHeader.biHeight = -lHeight;
// Width of the Image in pixels
bmpInfoHeader.biWidth = lWidth;
// Default number of planes
bmpInfoHeader.biPlanes = 1;
// Calculate the image size in bytes
bmpInfoHeader.biSizeImage = lWidth* lHeight * (wBitsPerPixel/8);
// This value should be values of BM letters i.e 0×4D42
// 0x4D = M 0x42 = B storing in reverse order to match with endian
bfh.bfType=0x4D42;
/* or
bfh.bfType = ‘B’+(’M’ << 8);
// <<8 used to shift ‘M’ to end
*/
// Offset to the RGBQUAD
bfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
// Total size of image including size of headers
bfh.bfSize = bfh.bfOffBits + bmpInfoHeader.biSizeImage;
// Create the file in disk to write
hFile = CreateFile( lpszFileName,GENERIC_WRITE, 0,NULL,
CREATE_NEW /*OPEN_ALWAYS*/, FILE_ATTRIBUTE_NORMAL, NULL);
if( !hFile ) // return if error opening file
{
return;
}
// Write the File header
WriteFile( hFile, &bfh, sizeof(bfh), &dwWritten , NULL );
// Write the bitmap info header
WriteFile( hFile, &bmpInfoHeader, sizeof(bmpInfoHeader), &dwWritten, NULL );
// Write the RGB Data
WriteFile( hFile, pBitmapBits, bmpInfoHeader.biSizeImage, &dwWritten, NULL );
// Close the file handle
CloseHandle( hFile );
{
BITMAPINFOHEADER bmpInfoHeader = {0};
BITMAPFILEHEADER bfh = {0};
HANDLE hFile = NULL;
DWORD dwWritten = 0;
// Set the size
bmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
// Bit count
bmpInfoHeader.biBitCount = wBitsPerPixel;
// Use all colors
bmpInfoHeader.biClrImportant = 0;
// Use as many colors according to bits per pixel
bmpInfoHeader.biClrUsed = 0;
// Store as un Compressed
bmpInfoHeader.biCompression = BI_RGB;
// Set the height in pixels
bmpInfoHeader.biHeight = -lHeight;
// Width of the Image in pixels
bmpInfoHeader.biWidth = lWidth;
// Default number of planes
bmpInfoHeader.biPlanes = 1;
// Calculate the image size in bytes
bmpInfoHeader.biSizeImage = lWidth* lHeight * (wBitsPerPixel/8);
// This value should be values of BM letters i.e 0×4D42
// 0x4D = M 0x42 = B storing in reverse order to match with endian
bfh.bfType=0x4D42;
/* or
bfh.bfType = ‘B’+(’M’ << 8);
// <<8 used to shift ‘M’ to end
*/
// Offset to the RGBQUAD
bfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
// Total size of image including size of headers
bfh.bfSize = bfh.bfOffBits + bmpInfoHeader.biSizeImage;
// Create the file in disk to write
hFile = CreateFile( lpszFileName,GENERIC_WRITE, 0,NULL,
CREATE_NEW /*OPEN_ALWAYS*/, FILE_ATTRIBUTE_NORMAL, NULL);
if( !hFile ) // return if error opening file
{
return;
}
// Write the File header
WriteFile( hFile, &bfh, sizeof(bfh), &dwWritten , NULL );
// Write the bitmap info header
WriteFile( hFile, &bmpInfoHeader, sizeof(bmpInfoHeader), &dwWritten, NULL );
// Write the RGB Data
WriteFile( hFile, pBitmapBits, bmpInfoHeader.biSizeImage, &dwWritten, NULL );
// Close the file handle
CloseHandle( hFile );
}