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

📄 bmpobject.cpp

📁 对位图文件中的点阵数据进行模式判别,找出其中的完整PDF417条码,并按照GB/T 17172-1997规范来解释读出对应的数据.
💻 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<<dBitCounts);
	if(dColorsNum<bi->biClrUsed)
		dColorsNum = bi->biClrUsed;

	return TRUE;
}

//对BMP数据进行反转
void CBmpObject::BmpDataReverse()
{
	UCHAR* tmp=new UCHAR[this->dBytesPerLine];
	for(UINT i=0;i<dImageHeight/2;i++)
	{
		if(i!=dImageHeight-1-i)
		{
			memcpy(tmp,&(lpBmpData[dBytesPerLine*i]),dBytesPerLine);
			memcpy(&(lpBmpData[dBytesPerLine*i]),
				&(lpBmpData[dBytesPerLine*(dImageHeight-1-i)]),
				dBytesPerLine);
			memcpy(&(lpBmpData[dBytesPerLine*(dImageHeight-1-i)]),tmp,dBytesPerLine);
		}
	}
	delete[] tmp;
}

//得到一个点的值
BYTE CBmpObject::GetPointValue(UINT x, UINT y)
{
	UCHAR tmp;
	switch(dBitCounts)
	{
	case 1:
		tmp = this->lpBmpData[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;
}

⌨️ 快捷键说明

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