📄 picture.cpp
字号:
黑港台津内桂鄂青湘辽沪甘赣澳",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 + -