Creating a DIB section from a BMP file | CodeGuru

Creating a DIB section from a BMP file

A DIB section is somewhat like the DIB in that it provides access to the bitmap bits for direct modification by the application. But unlike a DIB handle, a DIB section can be used with most GDI functions, including the BitBlt() and StretchBlt() functions. If you are familiar with the LoadImage() function, you know that […]

Written By
CodeGuru Staff
CodeGuru Staff
Aug 5, 1998
1 minute read
CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More




A DIB section is somewhat like the DIB in that it provides access to the bitmap bits for direct modification by the application. But unlike a DIB handle, a DIB section can be used with most GDI functions, including the BitBlt() and StretchBlt() functions. If you are familiar with the LoadImage() function, you know that this function can be used to create a DIB section from a bitmap file by using the LR_LOADFROMFILE flag. Although the documentation says that this flag is not supported in NT, the truth is that it works only partly on NT. Using the LoadImage() function on NT 4.0 with the LR_LOADFROMFILE flag will create a DIB section but the color information in the DIB section is not proper. The function given below works on NT as well as Windows 95.

// Function prototype with default arguments
HBITMAP LoadDIBSectionFromFile( LPCTSTR lpszFileName, LPVOID *ppvBits=NULL,
				HANDLE hSection=NULL, DWORD dwOffset=0) ;


// LoadDIBSectionFromFile	- Creates a DIB section from BMP file
// lpszFileName			- Name of the BMP file
// ppvBits			- to receive address of bitmap bits
// hSection		- optional handle to a file mapping object
// dwOffset		- offset to the bitmap bit values within hSection
HBITMAP LoadDIBSectionFromFile( LPCTSTR lpszFileName, LPVOID *ppvBits,
					HANDLE hSection, DWORD dwOffset)
{
	LPVOID lpBits;
	CFile file;
	if( !file.Open( lpszFileName, CFile::modeRead) )
		return NULL;

	BITMAPFILEHEADER bmfHeader;
	long nFileLen;

	nFileLen = file.GetLength();

	// Read file header
	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
		return NULL;

	// File type should be 'BM'
	if (bmfHeader.bfType != ((WORD) ('M' << 8) | 'B'))
		return NULL;

	BITMAPINFO *pbmInfo;
	pbmInfo = (BITMAPINFO *)::GlobalAlloc(GMEM_FIXED,
				sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256 );
	if (pbmInfo == NULL)
		return NULL;

	// Read the BITMAPINFO
	file.Read( pbmInfo, sizeof(BITMAPINFO) + sizeof(RGBQUAD)*256 );

	BITMAPINFO &bmInfo = *pbmInfo ;

	HBITMAP hBmp = CreateDIBSection( NULL, pbmInfo, DIB_RGB_COLORS, &lpBits,
						hSection, dwOffset );

	LPBYTE  lpDIBBits;              // Pointer to DIB bits
	int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
				1 << bmInfo.bmiHeader.biBitCount;

	if( bmInfo.bmiHeader.biBitCount > 8 )
		lpDIBBits = (LPBYTE)((LPDWORD)(bmInfo.bmiColors +
			bmInfo.bmiHeader.biClrUsed) +
			((bmInfo.bmiHeader.biCompression == BI_BITFIELDS) ? 3 : 0));
	else
		lpDIBBits = (LPBYTE)(bmInfo.bmiColors + nColors);

	int nOffset = sizeof(BITMAPFILEHEADER) + (lpDIBBits - (LPBYTE)pbmInfo);
	file.Seek( nOffset, CFile::begin);
	file.ReadHuge((LPSTR)lpBits, nFileLen - nOffset); //bmInfo.biSizeImage ); 

	::GlobalFree(pbmInfo);

	if( ppvBits )
		*ppvBits = lpBits;

	return hBmp;
}
CodeGuru Logo

CodeGuru covers topics related to Microsoft-related software development, mobile development, database management, and web application programming. In addition to tutorials and how-tos that teach programmers how to code in Microsoft-related languages and frameworks like C# and .Net, we also publish articles on software development tools, the latest in developer news, and advice for project managers. Cloud services such as Microsoft Azure and database options including SQL Server and MSSQL are also frequently covered.

Property of TechnologyAdvice. © 2026 TechnologyAdvice. All Rights Reserved

Advertiser Disclosure: Some of the products that appear on this site are from companies from which TechnologyAdvice receives compensation. This compensation may impact how and where products appear on this site including, for example, the order in which they appear. TechnologyAdvice does not include all companies or all types of products available in the marketplace.