www.pudn.com > EAN13Code.rar > Dib.cpp


/****************************************************************************** 
 * 文件名:Dib.cpp  
 * 功能:位图操作接口 
 * modified by PRTsinghua@hotmail.com 
******************************************************************************/ 
 
#include "StdAfx.h" 
#include "Dib.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
/****************************************************************************** 
 * 构造函数/析构函数 
******************************************************************************/ 
 
CDib::CDib() 
{ 
	m_hDrawDib=NULL; 
	m_pDib=NULL; 
} 
 
CDib::~CDib() 
{ 
	Close(); 
} 
 
 
/****************************************************************************** 
 * 画图 
******************************************************************************/ 
void CDib::Draw(CDC *pDC,int nWidth, int nHeight) 
{ 
	if(m_pDib!=NULL) 
	{ 
	ASSERT(IsValid()); 
	DrawDibRealize(m_hDrawDib,pDC->GetSafeHdc(),TRUE); 
	DrawDibDraw(m_hDrawDib,pDC->GetSafeHdc(), 
				0,  // 桌面的左部 
				0,  // 桌面的顶部 
				nWidth, 
				nHeight, 
				(BITMAPINFOHEADER *)m_pDib, 
				(LPVOID) GetBits(), 
				0,  // 图像的左部 
				0,  // 图像的顶部 
				((BITMAPINFOHEADER *)m_pDib)->biWidth, 
				((BITMAPINFOHEADER *)m_pDib)->biHeight, 
				DDF_BACKGROUNDPAL); 
	} 
} 
 
 
/****************************************************************************** 
 * 获得图像大小 
******************************************************************************/ 
CSize CDib::GetSize() 
{ 
	return CSize(((BITMAPINFOHEADER *)m_pDib)->biWidth, 
				 ((BITMAPINFOHEADER *)m_pDib)->biHeight);	 
} 
 
 
/****************************************************************************** 
 * 获得图像宽度 
******************************************************************************/ 
LONG CDib::GetWidth() 
{ 
	return ((BITMAPINFOHEADER *)m_pDib)->biWidth; 
} 
 
 
/****************************************************************************** 
 * 获得图像高度 
******************************************************************************/ 
LONG CDib::GetHeight() 
{ 
	return	((BITMAPINFOHEADER *)m_pDib)->biHeight; 
} 
 
 
/****************************************************************************** 
 * 关闭图像 
******************************************************************************/ 
void CDib::Close() 
{ 
	if(m_hDrawDib!=NULL) 
	{ 
		DrawDibClose(m_hDrawDib); 
		m_hDrawDib=NULL; 
	} 
 
	if(m_pDib!=NULL) 
	{ 
		delete m_pDib; 
		m_pDib=NULL; 
	} 
} 
 
 
/****************************************************************************** 
 * 打开图像 
******************************************************************************/ 
BOOL CDib::Open(const char * pzFileName) 
{ 
	CFile file; 
	int nBmpFileHeaderSize; 
 
	Close(); 
 
	if(!(m_hDrawDib=DrawDibOpen())) 
		goto exit; 
 
 	// 打开并读取位图信息 
	nBmpFileHeaderSize=sizeof(BITMAPFILEHEADER); 
 
	if(!file.Open(pzFileName,CFile::modeRead | CFile::typeBinary)) 
		goto exit; 
 
	if(file.Read((void *)&bmpFileHeader,nBmpFileHeaderSize)!=(UINT)nBmpFileHeaderSize) 
		goto failure; 
 
	// 验证位图信息 
	if(bmpFileHeader.bfType!=*((WORD *)"BM")) 
		goto failure; 
 
	// 申请内存 
	m_pDib=(BYTE *)new char [bmpFileHeader.bfSize-nBmpFileHeaderSize]; 
 
	// 内存申请失败 
	if(!m_pDib) 
		goto failure; 
 
	// 读取位图数据 
	file.Read(m_pDib,bmpFileHeader.bfSize-nBmpFileHeaderSize); 
	//file.ReadHuge(m_pDib,bmpFileHeader.bfSize-nBmpFileHeaderSize); 
 
	if(((BITMAPINFOHEADER *)m_pDib)->biSizeImage==0) 
	{ 
		BITMAPINFOHEADER *pDib=(BITMAPINFOHEADER *)m_pDib; 
		pDib->biSizeImage=((((pDib->biWidth*pDib->biBitCount)+31)&~31)>>3)*pDib->biHeight; 
	} 
 
	m_pDibBits=GetBits(); 
 
	file.Close(); 
	return TRUE; 
 
failure: 
	file.Close(); 
exit: 
	Close(); 
	return FALSE; 
} 
 
 
/****************************************************************************** 
 * 保存位图图像 
******************************************************************************/ 
BOOL CDib::Save(const char * pzFileName) 
{ 
	CFile file; 
	int nBmpFileHeaderSize; 
 
	nBmpFileHeaderSize=sizeof(BITMAPFILEHEADER); 
 
	if(!file.Open(pzFileName,CFile::modeCreate | CFile::modeWrite | CFile::typeBinary)) 
		goto exit; 
 
	file.Write(&bmpFileHeader,nBmpFileHeaderSize);  
 
	// 内存申请识别 
	if(!m_pDib) 
		goto failure; 
 
	file.Write(m_pDib,bmpFileHeader.bfSize-nBmpFileHeaderSize); 
	//file.WriteHuge(m_pDib,bmpFileHeader.bfSize-nBmpFileHeaderSize); 
 
	file.Close(); 
	return TRUE; 
 
failure: 
	file.Close(); 
exit: 
	return FALSE; 
} 
 
 
/****************************************************************************** 
 * 获得位图数据 
******************************************************************************/ 
BYTE * CDib::GetBits() 
{ 
	DWORD dwNumColors,dwColorTableSize; 
	BITMAPINFOHEADER *lpDib=(BITMAPINFOHEADER *)m_pDib; 
 
	WORD wBitCount=lpDib->biBitCount; 
 
	if(lpDib->biSize>=36) 
		dwNumColors=lpDib->biClrUsed; 
	else 
		dwNumColors=0; 
 
	if(dwNumColors==0) 
	{ 
		if(wBitCount!=24) 
			dwNumColors=1L<biSize+dwColorTableSize; 
} 
 
 
/****************************************************************************** 
 * 位图数据大小 
******************************************************************************/ 
int CDib::GetBiBitCount() 
{ 
	if(m_pDib!=NULL) 
		return ((BITMAPINFOHEADER *)m_pDib)->biBitCount;  
	return 0; 
}