⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdib.cpp

📁 基于图象理解的汽车牌照自动识别系统是智能交通系统(ITS)的一个重要分支
💻 CPP
📖 第 1 页 / 共 2 页
字号:
*
* 函数名称:
*   DIBWidth()
*
* 参数:
*   LPSTR lpbi         - 指向DIB对象的指针
*
* 返回值:
*   DWORD              - DIB中图像的宽度
*
* 说明:
*   该函数返回DIB中图像的宽度。对于Windows 3.0 DIB,返回BITMAPINFOHEADER
* 中的biWidth值;对于其它返回BITMAPCOREHEADER中的bcWidth值。
*
************************************************************************/


DWORD CDib::DIBWidth(LPSTR lpDIB)
{
	// 指向BITMAPINFO结构的指针(Win3.0)
	LPBITMAPINFOHEADER lpbmi;
	
	// 指向BITMAPCOREINFO结构的指针
	LPBITMAPCOREHEADER lpbmc;
	
	// 获取指针
	lpbmi = (LPBITMAPINFOHEADER)lpDIB;
	lpbmc = (LPBITMAPCOREHEADER)lpDIB;
	
	// 返回DIB中图像的宽度
	if (IS_WIN30_DIB(lpDIB))
	{
		// 对于Windows 3.0 DIB,返回lpbmi->biWidth
		return lpbmi->biWidth;
	}
	else
	{
		// 对于其它格式的DIB,返回lpbmc->bcWidth
		return (DWORD)lpbmc->bcWidth;
	}
}


/*************************************************************************
*
* 函数名称:
*   DIBHeight()
*
* 参数:
*   LPSTR lpDIB        - 指向DIB对象的指针
*
* 返回值:
*   DWORD              - DIB中图像的高度
*
* 说明:
*   该函数返回DIB中图像的高度。对于Windows 3.0 DIB,返回BITMAPINFOHEADER
* 中的biHeight值;对于其它返回BITMAPCOREHEADER中的bcHeight值。
*
************************************************************************/


DWORD CDib::DIBHeight(LPSTR lpDIB)
{
	// 指向BITMAPINFO结构的指针(Win3.0)
	LPBITMAPINFOHEADER lpbmi;
	
	// 指向BITMAPCOREINFO结构的指针
	LPBITMAPCOREHEADER lpbmc;
	
	// 获取指针
	lpbmi = (LPBITMAPINFOHEADER)lpDIB;
	lpbmc = (LPBITMAPCOREHEADER)lpDIB;
	
	// 返回DIB中图像的宽度
	if (IS_WIN30_DIB(lpDIB))
	{
		// 对于Windows 3.0 DIB,返回lpbmi->biHeight
		return lpbmi->biHeight;
	}
	else
	{
		// 对于其它格式的DIB,返回lpbmc->bcHeight
		return (DWORD)lpbmc->bcHeight;
	}
}


/*************************************************************************
*
* 函数名称:
*   PaletteSize()
*
* 参数:
*   LPSTR lpbi         - 指向DIB对象的指针
*
* 返回值:
*   WORD               - DIB中调色板的大小
*
* 说明:
*   该函数返回DIB中调色板的大小。对于Windows 3.0 DIB,返回颜色数目×
* RGBQUAD的大小;对于其它返回颜色数目×RGBTRIPLE的大小。
*
************************************************************************/


WORD CDib::PaletteSize(LPSTR lpbi)
{
	// 计算DIB中调色板的大小
	if (IS_WIN30_DIB (lpbi))
	{
		//返回颜色数目×RGBQUAD的大小
		return (WORD)(DIBNumColors(lpbi) * sizeof(RGBQUAD));
	}
	else
	{
		//返回颜色数目×RGBTRIPLE的大小
		return (WORD)(DIBNumColors(lpbi) * sizeof(RGBTRIPLE));
	}
}


/*************************************************************************
*
* 函数名称:
*   DIBNumColors()
*
* 参数:
*   LPSTR lpbi         - 指向DIB对象的指针
*
* 返回值:
*   WORD               - 返回调色板中颜色的种数
*
* 说明:
*   该函数返回DIB中调色板的颜色的种数。对于单色位图,返回2,
* 对于16色位图,返回16,对于256色位图,返回256;对于真彩色
* 位图(24位),没有调色板,返回0。
*
************************************************************************/
WORD CDib::DIBNumColors(LPSTR lpbi)
{
	WORD wBitCount;
	
	// 对于Windows的DIB, 实际颜色的数目可以比象素的位数要少。
	// 对于这种情况,则返回一个近似的数值。
	
	// 判断是否是WIN3.0 DIB
	if (IS_WIN30_DIB(lpbi))
	{
		DWORD dwClrUsed;
		
		// 读取dwClrUsed值
		dwClrUsed = ((LPBITMAPINFOHEADER)lpbi)->biClrUsed;
		
		if (dwClrUsed != 0)
		{
			// 如果dwClrUsed(实际用到的颜色数)不为0,直接返回该值
			return (WORD)dwClrUsed;
		}
	}
	
	// 读取象素的位数
	if (IS_WIN30_DIB(lpbi))
	{
		// 读取biBitCount值
		wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
	}
	else
	{
		// 读取biBitCount值
		wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
	}
	
	// 按照象素的位数计算颜色数目
	switch (wBitCount)
	{
	case 1:
		return 2;
		
	case 4:
		return 16;
		
	case 8:
		return 256;
		
	default:
		return 0;
	}
}


/*************************************************************************
*
* 函数名称:
*   DIBBitCount()
*
* 参数:
*   LPSTR lpbi         - 指向DIB对象的指针
*
* 返回值:
*   WORD               - 返回调色板中颜色的种数
*
* 说明:
*   该函数返回DIBBitCount。
*
************************************************************************/
WORD CDib::DIBBitCount(LPSTR lpbi)
{
	WORD wBitCount;
	
	// 读取象素的位数
	if (IS_WIN30_DIB(lpbi))
	{
		// 读取biBitCount值
		wBitCount = ((LPBITMAPINFOHEADER)lpbi)->biBitCount;
	}
	else
	{
		// 读取biBitCount值
		wBitCount = ((LPBITMAPCOREHEADER)lpbi)->bcBitCount;
	}
	
	// 返回wBitCount
	return wBitCount;
}

/*************************************************************************
*
* 函数名称:
*   CopyHandle()
*
* 参数:
*   HGLOBAL h          - 要复制的内存区域
*
* 返回值:
*   HGLOBAL            - 复制后的新内存区域
*
* 说明:
*   该函数复制指定的内存区域。返回复制后的新内存区域,出错时返回0。
*
************************************************************************/

HGLOBAL CDib::CopyHandle (HGLOBAL h)
{
	if (h == NULL)
		return NULL;
	
	// 获取指定内存区域大小
	DWORD dwLen = ::GlobalSize((HGLOBAL) h);
	
	// 分配新内存空间
	HGLOBAL hCopy = ::GlobalAlloc(GHND, dwLen);
	
	// 判断分配是否成功
	if (hCopy != NULL)
	{
		// 锁定
		void* lpCopy = ::GlobalLock((HGLOBAL) hCopy);
		void* lp     = ::GlobalLock((HGLOBAL) h);
		
		// 复制
		memcpy(lpCopy, lp, dwLen);
		
		// 解除锁定
		::GlobalUnlock(hCopy);
		::GlobalUnlock(h);
	}
	
	return hCopy;
}

/*************************************************************************
*
* 函数名称:
*   ReadDIBFile()
*
* 参数:
*   CFile& file        - 要读取得文件文件CFile
*
* 返回值:
*   HDIB               - 成功返回DIB的句柄,否则返回NULL。
*
* 说明:
*   该函数将指定的文件中的DIB对象读到指定的内存区域中。除BITMAPFILEHEADER
* 外的内容都将被读入内存。
*
*************************************************************************/

HDIB CDib::ReadDIBFile(CFile& file)
{
	BITMAPFILEHEADER bmfHeader;
	DWORD dwBitsSize;
	HDIB hDIB;
	LPSTR pDIB;
	
	// 获取DIB(文件)长度(字节)
	dwBitsSize = file.GetLength();
	
	// 尝试读取DIB文件头
	if (file.Read((LPSTR)&bmfHeader, sizeof(bmfHeader)) != sizeof(bmfHeader))
	{
		// 大小不对,返回NULL。
		return NULL;
	}
	
	// 判断是否是DIB对象,检查头两个字节是否是"BM"
	if (bmfHeader.bfType != DIB_HEADER_MARKER)
	{
		// 非DIB对象,返回NULL。
		return NULL;
	}
	
	// 为DIB分配内存
	hDIB = (HDIB) ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, dwBitsSize);
	if (hDIB == 0)
	{
		// 内存分配失败,返回NULL。
		return NULL;
	}
	
	// 锁定
	pDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB);
	
	// 读象素
	if (file.ReadHuge(pDIB, dwBitsSize - sizeof(BITMAPFILEHEADER)) !=
		dwBitsSize - sizeof(BITMAPFILEHEADER) )
	{
		// 大小不对。
		
		// 解除锁定
		::GlobalUnlock((HGLOBAL) hDIB);
		
		// 释放内存
		::GlobalFree((HGLOBAL) hDIB);
		
		// 返回NULL。
		return NULL;
	}
	
	// 解除锁定
	::GlobalUnlock((HGLOBAL) hDIB);
	
	// 返回DIB句柄
	return hDIB;
}
/**************************************************************************** 
* 
* 函数名称: 
*    BytesPerLine() 
*  
* 参数:   
*    LPBYTE lpDIB - BITMAPINFOHEADER指针  
* 
* 返回值:  
*    返回DIB每一行所占字节数 
*
* 说明:  
*    计算DIB中每一行所占字节数
* 
*****************************************************************************/ 
DWORD CDib::BytesPerLine(LPBYTE lpDIB) 
{ 
    return WIDTHBYTES(((LPBITMAPINFOHEADER)lpDIB)->biWidth * ((LPBITMAPINFOHEADER)lpDIB)->biPlanes * ((LPBITMAPINFOHEADER)lpDIB)->biBitCount); 
} 

DWORD CDib::BytesPerLine(HDIB hDIB) 
{ 
	LPBYTE lpDIB = (LPBYTE)GlobalLock(hDIB);
	DWORD dw = BytesPerLine(lpDIB);
	GlobalUnlock(hDIB);
	return dw;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -