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

📄 picture.cpp

📁 高速公路收费系统车道软件. 功能: 1 检测公路过往车辆 2 收费过程控制和数据采集 3 车辆信息和图片上传服务器.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			黑港台津内桂鄂青湘辽沪甘赣澳",MAX_SYMBOL_COUNT-1);
		memset(strHZ,0,MAX_HZ_COUNT);
		GetHZK(strHZ,tmpStr,fp1);
//	将收费站名称字库读入内存
		memset(tmpStr,0,MAX_SYMBOL_COUNT);
		CLaneInfo m_clsLane;
		m_clsLane.GetPlazaName(tmpStr);
		memset(strPlaza,0,720);
		nPlazaLen=0;
//	读取汉字库时会滤除非汉字字符,因此用该函数计算收费站名称中汉
//	字的长度
		GetHZK(strPlaza,tmpStr,fp1);
		fclose(fp1);
//	将交易字符读入内存
		memset(strFileName,0,130);
		theApp.GetFullPath(strFileName);
		strcat(strFileName,"hzk16");
		if((fp1=fopen(strFileName,"rb"))==NULL){
			SendMessageTimeout(AfxGetMainWnd()->m_hWnd,WM_ABNORMAL,0,(LPARAM)"无法打开16点阵字库文件\n",SMTO_BLOCK,500,&RetValue);
			return;
		}
		memset(tmpStr,0,MAX_SYMBOL_COUNT);
		memmove(tmpStr,"0123456789/: ABCDEFG\
			HIGKLMNOPQRSTUVWXYZ",78);
		memset(strASCII,0,MAX_ASCII_COUNT);
		GetASCII(strASCII,tmpStr,fp1);
		fclose(fp1);	
		bOverlayOK=TRUE;
	}
	catch(...){
		SendMessageTimeout(AfxGetMainWnd()->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CImageProcess::CreateHZK()出现异常\n",SMTO_BLOCK,500,&RetValue);
	}
}

//	叠加车型:车型位于第四行右边
void CImageProcess::OverlayBusClass(UCHAR *pData,UCHAR cBusClass)
{
	if(bOverlayOK!=TRUE) return;
//	if((cBusClass<1)||(cBusClass>9)) return;
	int iX=iImageWidth*100+180;
	int iY=iImageWidth*3;
	OverlayHZ(iX,iY,pData,ADDR_CLASS,2);		//叠加车型
	iX=iImageWidth*104+260;
	OverlayASCII(iX,iY,pData,cBusClass);
}

//	叠加车情:车情位于第五行右边
void CImageProcess::OverlayBusType(UCHAR *pData,char chBusType)
{
	if(bOverlayOK!=TRUE) return;
	int iX=iImageWidth*130+180;
	int iY=iImageWidth*3;
	switch(chBusType){
	case TYPE_NORMAL:					//正常车
		OverlayHZ(iX,iY,pData,ADDR_NORMAL,3);
		break;
	case TYPE_ARMY_POLICE:				//军车
		OverlayHZ(iX,iY,pData,ADDR_ARMY_POLICE,3);
		break;
	case TYPE_FREE:						//免征车
		OverlayHZ(iX,iY,pData,ADDR_FREE,3);
		break;
	case TYPE_MONTH:					//月票车
		OverlayHZ(iX,iY,pData,ADDR_MONTH,3);
		break;
	case '8':							//更改
		OverlayHZ(iX,iY,pData,ADDR_MODIFY,2);
		break;
	case '9':							//违章
		OverlayHZ(iX,iY,pData,ADDR_VIOLATE,2);
		break;
	}
}

//	叠加车牌:车牌位于第六行右边
void CImageProcess::OverlayBusNO(UCHAR *pData,UCHAR *pStr)
{
	if(bOverlayOK!=TRUE) return;
//	车牌中的空字符用空格填充,首先将空格丢弃
	char strBusNO[12];
	memset(strBusNO,0,12);
	int nCount=0;
	for(int i=0;i<10;i++){
		if(pStr[i]==' ') continue;
		strBusNO[nCount]=pStr[i];
		nCount++;
	}
	if(nCount==0) return;
//	叠加车牌中的汉字:车牌的前两个字符总为汉字
	int iX=iImageWidth*160+180;
	int iY=iImageWidth*3;
	char chIndex=GetHzIndex(strBusNO[0]-'0',strBusNO[1]-'0');
	if(chIndex<100){		//若为合法的汉字
		OverlayHZ(iX,iY,pData,chIndex+ADDR_START_NO,1);	//叠加车牌中的汉字
		iX+=30;
	}
	if(nCount<2) return;
	for(i=2;i<nCount;i++){
		if(strBusNO[i]>='A'){
			OverlayASCII(iX,iY,pData,strBusNO[i]-'A'+ADDR_START_ASCII);
		} else {
			OverlayASCII(iX,iY,pData,strBusNO[i]-'0');
		}
		iX+=18;
	}
}

//	叠加价格:价格信息位于第七行右边
void CImageProcess::OverlayFare(UCHAR *pData,UCHAR *pStr)
{
	if(bOverlayOK!=TRUE) return;
	int iX=iImageWidth*190+180;
	int iY=iImageWidth*3;
	OverlayHZ(iX,iY,pData,ADDR_FARE,2);		//价格
	iX=iImageWidth*194+260;
	OverlayASCII(iX,iY,pData,pStr[0]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[1]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[2]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[3]-'0');
}

//	叠加收费员工号:收费员工号位于第三行右边
void CImageProcess::OverlayCollectNO(UCHAR *pData,UCHAR *pStr)
{
	if(bOverlayOK!=TRUE) return;
	int iX=iImageWidth*40+180;
	int iY=iImageWidth*3;
	OverlayHZ(iX,iY,pData,ADDR_COLLECT,3);		//收费员
	iX=iImageWidth*44+260;
	OverlayASCII(iX,iY,pData,pStr[0]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[1]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[2]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[3]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[4]-'0');
}

//	叠加车道号码,车道号码位于第二行的右边
void CImageProcess::OverlayLaneNO(UCHAR *pData,UCHAR *pStr)
{
	if(bOverlayOK!=TRUE) return;
	int iX=iImageWidth*70+180;
	int iY=iImageWidth*3;
	OverlayHZ(iX,iY,pData,ADDR_LANE,2);		//车道
	iX=iImageWidth*74+260;
	OverlayASCII(iX,iY,pData,pStr[0]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[1]-'0');
}

//	叠加收费站名称:收费站名称位于第一行的右边
void CImageProcess::OverlayPlazaNO(UCHAR *pData)
{
	if(bOverlayOK!=TRUE) return;
	int iX=iImageWidth*10+180;
	int iY=iImageWidth*3;
	int iLen=nPlazaLen*72;
	for(int iPosition=0;iPosition<iLen;iPosition+=72){
		for(int i=0;i<24;i++){
			for(int j=0;j<3;j++){
				for(int k=0;k<8;k++){
					if((strPlaza[iPosition+i*3+j]>>(7-k))&1){
						*(pData+(iX+i)*3+(j*8+k)*iY)=0;	
										//叠加汉字为绿色
						*(pData+(iX+i)*3+(j*8+k)*iY+1)=255;
						*(pData+(iX+i)*3+(j*8+k)*iY+2)=0;
					}
				}
			}
		}
		iX+=26;
	}
}

//	叠加日期、时间信息:日期、时间信息分别位于第八、九行
void CImageProcess::OverlayTime(UCHAR *pData,UCHAR *pStr)
{
	if(bOverlayOK!=TRUE) return;
	int iX=iImageWidth*220+180;
	int iY=iImageWidth*3;
	OverlayASCII(iX,iY,pData,pStr[0]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[1]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,10);			//叠加“/”
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[2]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[3]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,10);
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[4]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[5]-'0');
	iX=iImageWidth*240+180;
	OverlayASCII(iX,iY,pData,pStr[6]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[7]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,11);			//叠加“:”
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[8]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[9]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,11);			//叠加“:”
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[10]-'0');
	iX+=18;
	OverlayASCII(iX,iY,pData,pStr[11]-'0');
}

void CImageProcess::OverlayHZ(int X,int Y,UCHAR *pData,int iStart,int iLen)
{
	for(int iIndex=iStart;iIndex<iStart+iLen;iIndex++){
		int iPosition=iIndex*72;		//每个汉字字库占用72个字节
		for(int i=0;i<24;i++){
			for(int j=0;j<3;j++){
				for(int k=0;k<8;k++){
					if((strHZ[iPosition+i*3+j]>>(7-k))&1){
						*(pData+(X+i)*3+(j*8+k)*Y)=0;	
										//叠加汉字为绿色
						*(pData+(X+i)*3+(j*8+k)*Y+1)=255;
						*(pData+(X+i)*3+(j*8+k)*Y+2)=0;
					}
				}
			}
		}
		X+=26;
	}
}

void CImageProcess::OverlayASCII(int X,int Y,UCHAR *pData,int iIndex)
{
	int iPosition=iIndex*32;
	for(int i=0;i<16;i++){
		for(int j=0;j<2;j++){
			for(int k=0;k<8;k++){
				if((strASCII[iPosition+i*2+j]>>(7-k))&1){
					*(pData+(X+j*8+k)*3+i*Y)=0;		//叠加字符为绿色
					*(pData+(X+j*8+k)*3+i*Y+1)=255;
					*(pData+(X+j*8+k)*3+i*Y+2)=0;
				}
			}
		}
	}
}

//	从24点阵字库中读取汉字到内存中
void CImageProcess::GetHZK(char *pHZK, char *pHZ, FILE *fp)
{
	UCHAR tmpCh,chFirstByte,chLastByte;
	BOOL bFirstFlag=TRUE;
	ULONG nPosition=0;
	ULONG nIndex=0;
	while((tmpCh=*pHZ++)!=0){
		if(tmpCh>=0xa1){
			if(bFirstFlag){
				chFirstByte=(tmpCh-0xa1)&0x7f;
				bFirstFlag=FALSE;
			} else {
				chLastByte=(tmpCh-0xa1)&0x7f;
				bFirstFlag=TRUE;
//	24点阵汉字中无符号字符,因此需要扣除前16个区
				nPosition=((chFirstByte-15)*94+chLastByte)*72L;
				fseek(fp,nPosition,SEEK_SET);
				fread(pHZK+nIndex,72,1,fp);
				nIndex+=72;
				nPlazaLen++;
			}
		}
	}
}

//	从16点针汉字中读取字符到内存中
void CImageProcess::GetASCII(char *pASCII, char *pStr, FILE *fp)
{
	UCHAR tmpCh,chFirstByte,chLastByte;
	BOOL bFirstFlag=TRUE;
	ULONG nPosition=0;
	ULONG nIndex=0;
	while((tmpCh=*pStr++)!=0){
		if(tmpCh>=0xa1){
			if(bFirstFlag){
				chFirstByte=(tmpCh-0xa1)&0x7f;
				bFirstFlag=FALSE;
			} else {
				chLastByte=(tmpCh-0xa1)&0x7f;
				bFirstFlag=TRUE;
				nPosition=(chFirstByte*94+chLastByte)*32L;
				fseek(fp,nPosition,SEEK_SET);
				fread(pASCII+nIndex,32,1,fp);
				nIndex+=32;
			}
		}
	}
}

char CImageProcess::GetHzIndex(int x, int y)
{
	switch(y){
	case 0:					//闽、粤、军、警、浙、新、冀、晋、苏、黄
		if((x>=0)&&(x<=9)) return x;
	case 1:					//吉、琼、宁、皖、鲁、豫
		if((x>=2)&&(x<=7)) return x+8;
		if(x==9) return x+7;//蓝
		break;
	case 2:					//川、渝、贵、云、藏、陕、京、黑
		if((x>=2)&&(x<=9)) return x+15;
		break;
	case 3:					//港、台、津、内、桂、鄂
		if((x>=2)&&(x<=7)) return x+21;
		break;
	case 4:					//青、湘、辽、沪、甘、赣
		if((x>=2)&&(x<=7)) return x+25;
		if(x==9) return x+24;//澳
		break;
	}
	return 100;
}

⌨️ 快捷键说明

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