www.pudn.com > pdf417.rar > BmpObject.cpp


// BmpObject.cpp: implementation of the CBmpObject class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "pdf417.h" 
#include "BmpObject.h" 
//#include "vfw.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBmpObject::CBmpObject() 
{ 
	lpFileBuffer = NULL; 
} 
 
CBmpObject::~CBmpObject() 
{ 
	//如果所申请的区域不为空,则删除 
	if(this->lpFileBuffer != NULL)   
		delete[] lpFileBuffer; 
} 
 
BOOL CBmpObject::ReadBmpFile(CString& BmpFileName) 
{ 
	if(BmpFileName.GetLength() == 0) return FALSE; 
 
	CFile f; 
	CFileException e; 
	DWORD sizeofBmpFile;	//文件长度 
	BITMAPFILEHEADER* bf;	//文件头指针 
	UINT dColorsNum;		//图像颜色数 
 
	//打开文件 
	if(!f.Open(BmpFileName,CFile::modeRead,&e)) 
	{ 
		AfxMessageBox("不能打开文件!"); 
		return FALSE; 
	} 
 
	sizeofBmpFile = f.GetLength(); 
 
	//申请缓冲区存放数据,此缓冲区在对象析构时销毁 
	this->lpFileBuffer = new UCHAR[sizeofBmpFile];	 
	ASSERT(lpFileBuffer); 
 
	//读入文件数据后关闭文件 
	f.Read(this->lpFileBuffer,sizeofBmpFile); 
	f.Close(); 
 
	//得到文件头指针 
	bf = (BITMAPFILEHEADER*)(this->lpFileBuffer); 
	if(!(lpFileBuffer[0]=='B'&&lpFileBuffer[1]=='M')) 
	{ 
		delete[] lpFileBuffer; 
		lpFileBuffer = NULL; 
		AfxMessageBox("此文件不是BMP图形文件!",MB_ICONEXCLAMATION); 
		return FALSE; 
	} 
	//得到数据信息头指针 
	bi = (BITMAPINFOHEADER*)(this->lpFileBuffer+sizeof(BITMAPFILEHEADER)); 
	//BMP图像数据区域指针 
	this->lpBmpData = this->lpFileBuffer+bf->bfOffBits;  
	//设置宽度及高度 
	this->dImageWidth = bi->biWidth; 
	this->dImageHeight = bi->biHeight; 
	this->dBitCounts = bi->biBitCount; 
 
	//判断数据位是否为1,4,8,如不是,则提示用户,并清缓冲区后返回 
	if(dBitCounts!=1 && dBitCounts!=4 && dBitCounts!=8) 
	{ 
		AfxMessageBox(IDS_ERRFILESTYLE,MB_ICONEXCLAMATION); 
		delete[] lpFileBuffer; 
		lpFileBuffer = NULL; 
		return false; 
	} 
 
	//一行数据的长度 
	this->dBytesPerLine = (((DWORD)dImageWidth*dBitCounts+31)/32)*4; 
	//颜色表地址 
	this->lpColorData = (RGBQUAD*)(lpFileBuffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)); 
	//颜色项多少 
	dColorsNum=0; 
	if(dBitCounts!=24)  
		dColorsNum = (1<biClrUsed) 
		dColorsNum = bi->biClrUsed; 
 
	return TRUE; 
} 
 
//对BMP数据进行反转 
void CBmpObject::BmpDataReverse() 
{ 
	UCHAR* tmp=new UCHAR[this->dBytesPerLine]; 
	for(UINT i=0;ilpBmpData[y*this->dBytesPerLine+x/8]; 
		if(tmp&(0x80>>x%8)) return 1; 
		else return 0; 
	case 4: 
		tmp = this->lpBmpData[y*this->dBytesPerLine+x/2]; 
		if(x%2) return tmp&0x0f; 
		else return (tmp>>4)&0x0f; 
	case 8: 
		tmp = this->lpBmpData[y*this->dBytesPerLine+x]; 
		return tmp; 
	default: 
		AfxMessageBox(IDS_ERRFILESTYLE,MB_ICONEXCLAMATION); 
		return 0; 
	} 
} 
 
//判断一点是否为BLACK色 
//根据点的RGB值是否为(0,0,0) 
BOOL CBmpObject::IsBlack(UINT x, UINT y) 
{ 
	if(dBitCounts <=8) 
	{ 
		RGBQUAD tmp = lpColorData[this->GetPointValue(x,y)]; 
		return (tmp.rgbBlue+tmp.rgbGreen+tmp.rgbRed==0); 
	} 
	else return false; 
}