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

📄 imageproc.cpp

📁 GPS programme for changchun at 8X
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/***********************************************************/
//vertion: Sam_2V1.1
//codemen : Adam
//Instruction: In this vertion ,we change the two dlls
//			   into several head files;
/***********************************************************/

#include "ImageProc.h"
#include "spdec.h"
#include "RS.h"
/***************************************************/
// Construction/Destruction
/***************************************************/

BITMAPINFO *ImageProc::m_pBmp = NULL;//for Display

ImageProc::ImageProc()
{

	m_hWnd = NULL;

	//初始化窗口位置
	m_WinPar.StarX = 0;
	m_WinPar.EndX  = 409;
	m_WinPar.StarY = 0;
	m_WinPar.EndY  = 307;
	
	//创建初始化窗口线程

	DWORD dwThrID;	
	CreateThread(NULL, 0, &ImageProc::InitShowWnd, this, 0, &dwThrID);	

	//初始化显示位图头
	memset(&m_vdw, 0, sizeof(m_vdw));	
	m_vdw.pBmp = NULL;
	m_vdw.pBmp = (BITMAPINFO *)(new char[sizeof(BITMAPINFO)+sizeof(RGBQUAD)*256]);
	m_vdw.pBmp->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  //文件信息头大小
	m_vdw.pBmp->bmiHeader.biWidth = IMG_WIDTH;                //图像宽度
	m_vdw.pBmp->bmiHeader.biHeight = -1 * IMG_HEIGHT;         //图像高度
	m_vdw.pBmp->bmiHeader.biPlanes = 1;        
	m_vdw.pBmp->bmiHeader.biBitCount = 8;                     //图像像素精度
	m_vdw.pBmp->bmiHeader.biCompression = BI_RGB;             //是否压缩
	m_vdw.pBmp->bmiHeader.biSizeImage = 0;      
	m_vdw.pBmp->bmiHeader.biYPelsPerMeter = 0;              //图像数据大小
	m_vdw.pBmp->bmiHeader.biXPelsPerMeter = 0;
	m_vdw.pBmp->bmiHeader.biClrUsed = 256;
	m_vdw.pBmp->bmiHeader.biClrImportant = 0;

	//创建颜色表
	RGBQUAD clr[256];
	for (int i=0; i<256; i++)
	{
		clr[i].rgbBlue = i;
		clr[i].rgbGreen = i;
		clr[i].rgbRed = i;
		clr[i].rgbReserved = 0;
		m_vdw.pBmp->bmiColors[i] = clr[i];
	}

	
	m_vdw.pBuf=PCHAR(m_abyImgBuf)+BmpHeaderLen;
// 	m_vdw.pTitle=NULL;
	m_vdw.pWinPar=&(m_WinPar);

 	ImageProc::m_pBmp = m_vdw.pBmp;//for Display

// 	m_vdw.pBuf = PCHAR(RecImg);

	
}


ImageProc::~ImageProc()
{
	::SendMessage(m_hWnd, WM_DESTROY, 0, 0);
 
	for(int i=0;i<3;i++)
		{
			if(UnregisterClass(_T("CGIIRecImg"), m_hinst)==0)
//		The UnregisterClass function unregisters a window class, freeing the memory required for the class. 
			{
				Sleep(1);
	
			}
			else{
				break;
			}
		}
		
}

	


/***************************************************/
//Description
/***************************************************/
DWORD WINAPI ImageProc::ImageProcThread(LPVOID lpvoid)
{
	ImageProc *pThis = (ImageProc *)lpvoid;

	CFile sourcefile;
	WIN32_FIND_DATA FindFileData;
	HANDLE hFind;
	
	int nSavedImgFileNum;
	CString szName;//存储图像文件名

	int nSavedInfoFileNum;
	CString szInfo;//存储辅助信息文件名


	CString szSubframeRaw;//for test;
	FILE *fSubframeRaw;
//
//	CString szTest;   //test,with nothing done! just separate the whole stream into  21 subframes;
// 	FILE *fTest;
	int test;

//add error report

	CString szErrorReport;
	FILE *fErrorReport;


	FILE *fInfo;
	
	unsigned char *pCurStream;
	
	unsigned char *pStrAfterRSDec;

	unsigned char *pSubFrameAStart;

	unsigned char *pSubFrameBStart;

	unsigned char *pSubFrameAToSpDec;

	unsigned char *pSubFrameBToSpDec;

	unsigned char *pRecSubImgA;

	unsigned char *pRecSubImgB;
	
	unsigned char *pRecImg;
	
	
	char chFrameFlag;
	int nFileLength;

	int	 pnPakDeced;
	int	 pnPakProed;

	int nBlockNum;//Block=10*packets+1*frame+3*packets
	int nBlockCont=0;
	
	int nLastPackOfNoErrStream;
	int nSpihtStrlen;

	int nFrameNum;
	int nSubFrameNum;
	int nPacketNum;
	
	int arrPackNumA[PACKET_OF_SUBFRAME_A];
	int arrPackNumB[PACKET_OF_SUBFRAME_B];

	int arrPackNumcout;
	int nSubFramecont;

// 	BOOL bPackErrFlag;有包计数数组,就行了
//  
	BOOL bSubFrameErrFlag;//用于跳出循环
	BOOL bFrameErrFlag;

//for debug vertion,delete the last 8 bytes in each line,change 4016 to 4008;				
	int nDebugline;
	int nDebugpixel;

	char szDirPath[100];

//	The function can be used to set  a directory that receive from interface;
//	CreateDirectory("f:\\adam",NULL);

	strcpy(szDirPath,pThis->m_sourcefile);
	
	hFind = FindFirstFile (szDirPath, &FindFileData);

	pThis->m_sourcefile.Replace(FindFileData.cFileName,"*.dat");
	
	strcpy(szDirPath,pThis->m_sourcefile);
	
	TRACE("Target file is %s.\n", szDirPath);

	hFind = FindFirstFile (szDirPath, &FindFileData);

	if (hFind == INVALID_HANDLE_VALUE)
		TRACE("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
	else 	
		TRACE("The first file found is %s\n", FindFileData.cFileName); 
	 
 	sourcefile.Open(FindFileData.cFileName,CFile::modeRead);

//add error report
	szErrorReport.Format(_T("e:\\Decompressed stream\\%s_error_report.txt"),FindFileData.cFileName);	
	fErrorReport = fopen(szErrorReport,"w+");
	fprintf(fErrorReport," count from 0\n");
	
	nFileLength=sourcefile.GetLength();

	nBlockNum=nFileLength/BLOCK_LENGTH;

	if (nBlockNum==0)
	{
		nBlockNum=1;
	}

	TRACE("nBlockNum==%d.\n",nBlockNum);
	
	RS_init();

//Display the image to the screen
		
	pRecImg = pThis->RecImg;//To point the pointer; 
 	memcpy(pThis->m_vdw.pBuf,pRecImg,IMAGE_RECOVERED_LENGTH);
	pThis->m_vdw.pBuf = (PCHAR)pRecImg;
	TRACE("Displaying");
	::ShowWindow (pThis->m_hWnd, SW_SHOW);


	while (nBlockCont<nBlockNum)//块循环,即帧循环
	{	
		
		pThis->m_vdw.pTitle = (PCHAR)FindFileData.cFileName;
		pRecImg = pThis->RecImg;//To point the pointer; 
		memset(pRecImg,0,IMAGE_RECOVERED_LENGTH);

		pCurStream = pThis->CurStream;	
		memset(pCurStream,0,BLOCK_LENGTH);//清零
		
		sourcefile.Read(pCurStream,BLOCK_LENGTH);//the position of the pointer is not changed;

//for test


		pCurStream = pCurStream + 1024*10;
		
		for (test = 0; test<20; test++)
		{
			szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_RS%d.dat"),FindFileData.cFileName,test);	
			fSubframeRaw = fopen(szSubframeRaw,"wb+");
	
			fwrite(pCurStream,1,SUBFRAME_A_LENGTH,fSubframeRaw);
			fclose(fSubframeRaw);
			
			pCurStream = pCurStream + SUBFRAME_A_LENGTH;

		}

		szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_RS%d.dat"),FindFileData.cFileName,20);	
		fSubframeRaw = fopen(szSubframeRaw,"wb+");			
				
		fwrite(pCurStream,1,SUBFRAME_B_LENGTH,fSubframeRaw);
		fclose(fSubframeRaw);


		pCurStream = pThis->CurStream;	
		pStrAfterRSDec = pThis->StrAfterRSDec;
		memset(pStrAfterRSDec,0,BLOCK_LENGTH_AFTER_RSDEC);
	
		fnRSDecDllEx(fErrorReport,pCurStream, PACKET_NUM_OF_BLOCK ,&pnPakDeced, &pnPakProed, pStrAfterRSDec);
		//After RSDec,pStrAfterRSDec is at the start of the data block;
		
		TRACE(" %d packets(1024) are received",pnPakProed);
		TRACE(" %d packets(1024) are RsDeced",pnPakDeced);
		
//add error report
		fprintf(fErrorReport," %d packets(1024) are received\n",pnPakProed);
		fprintf(fErrorReport," %d packets(1024) are RsDeced\n",pnPakDeced);



		chFrameFlag=pStrAfterRSDec[FRAME_TYPE_OFFSET];//useless	
	
		//To jump the 55 packets,find the packet of image frame
		while(!(pStrAfterRSDec[PACKET_TYPE_OFFSET]==PACKET_OF_IMAGE))
		{
			pStrAfterRSDec=pStrAfterRSDec+PACKET_LENGTH;
		}


		//Whether the frame is complete or not,the dealing is the same.
		nFrameNum=*(pStrAfterRSDec+FRAME_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+FRAME_NUM_HIGH_OFFSET))*16;				

		bFrameErrFlag=0;

		nSubFramecont=0;
	

		while(nSubFramecont<SUBFRAME_NUM_OF_FRAME&&!bFrameErrFlag)//子帧循环,从 1 开始计数
		{			
//Refresh;					
			::SendMessage(pThis->m_hWnd, MSG_SHOWIMG, 0, (LPARAM)&pThis->m_vdw);//Display .bmp;
		
			nSubFrameNum=*(pStrAfterRSDec+SUBFRAME_NUM_OFFSET);

			nSubFramecont=nSubFrameNum;//重新计数

			TRACE("Processing subframe %d",nSubFramecont);

			bSubFrameErrFlag=0;			

//				//Stop subframe circle while the packet flag changed; 
//				if (chPacketFlag!=*(pStrAfterRSDec+PACKET_FLAG_OFFSET))
//				{
//					break;
//				}


			if (nSubFramecont==SUBFRAME_B_POS_OF_FRAME)// SubFrame type B;
			{
					
				for (arrPackNumcout=0;arrPackNumcout < PACKET_OF_SUBFRAME_B;arrPackNumcout++)//包计数数组复位
				{
					arrPackNumB[arrPackNumcout]=0;
				}
				
				pSubFrameBStart = pThis->SubFrameBStart;
				memset(pSubFrameBStart,0,SUBFRAME_B_LENGTH_AFTER_RSDEC);
				memcpy(pSubFrameBStart,pStrAfterRSDec,SUBFRAME_B_LENGTH_AFTER_RSDEC);
				
				nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
				arrPackNumcout=0;//清零


				while (nPacketNum < PACKET_OF_SUBFRAME_B && !bSubFrameErrFlag&&!bFrameErrFlag)//包循环,从 1 开始计数
				{					
					if (!bSubFrameErrFlag&&!bFrameErrFlag)
					{							
						arrPackNumB[arrPackNumcout]=nPacketNum;	//记录包计数						
						arrPackNumcout++;
						pStrAfterRSDec=pStrAfterRSDec+PACKET_AFTER_RSDEC_LENGTH;	
						nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
					}	

					//如果帧计数出错,跳出
					if (nFrameNum!=*(pStrAfterRSDec+FRAME_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+FRAME_NUM_HIGH_OFFSET))*16)
					{							
						bFrameErrFlag=1;
					}
					
					//如果子帧计数出错,跳出
					if (nSubFramecont!=*(pStrAfterRSDec+SUBFRAME_NUM_OFFSET))
					{							
						bSubFrameErrFlag=1;
					}

				}
					
				if (!bFrameErrFlag)
				{
					nLastPackOfNoErrStream=pThis->TreatPackNumErrB(arrPackNumB);

					if (nLastPackOfNoErrStream < PACKET_OF_SUBFRAME_B -1)//Packet Lost;
					{
						TRACE("%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_B - 2 - nLastPackOfNoErrStream,nSubFramecont);
						//add error report
						fprintf(fErrorReport,"%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_B - 2 - nLastPackOfNoErrStream,nSubFramecont);
		

					}
					
					pSubFrameBToSpDec = pThis->SubFrameBToSpDec;
					memset(pSubFrameBToSpDec,0,SUBFRAME_B_TO_SPDEC_LENGTH);
					nSpihtStrlen=pThis->FormSpDecStreamB(nLastPackOfNoErrStream,pSubFrameBStart,pSubFrameBToSpDec);
					
					pRecSubImgB = pThis->RecSubImgB;
 					memset(pRecSubImgB,0,SUBFRAME_B_RECOVERED_LENGTH);

					fnSpDecDll(pSubFrameBToSpDec,pRecSubImgB,nSpihtStrlen);//here is wrong, "00"//the first byte of the block SubFrameBToSpDec is the hold

//for debug vertion,delete the last 8 bytes in each line,change 4016 to 4008;				

					for (nDebugline=1; nDebugline<216; nDebugline++)
					{
						for (nDebugpixel=0; nDebugpixel<4008; nDebugpixel++)
						{
							pRecSubImgB[4008*nDebugline + nDebugpixel] = pRecSubImgB[4016*nDebugline + nDebugpixel];
						}
					}





//for test, save the subframe before decompressed;
				
					szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_%d.dat"),FindFileData.cFileName,nSubFramecont);	
					fSubframeRaw = fopen(szSubframeRaw,"wb+");			
					
					fwrite(pSubFrameBToSpDec,1,SUBFRAME_B_TO_SPDEC_LENGTH,fSubframeRaw);
			
					fclose(fSubframeRaw);




//for test, save the subframe after decompressed;
				
					szSubframeRaw.Format(_T("e:\\Decompressed stream\\%s_%d.raw"),FindFileData.cFileName,nSubFramecont);	
					fSubframeRaw = fopen(szSubframeRaw,"wb+");			
					
					fwrite(pRecSubImgB,1,SUBFRAME_B_RECOVERED_LENGTH,fSubframeRaw);
			
					fclose(fSubframeRaw);

					memcpy(pRecImg,pRecSubImgB,SUBFRAME_B_RECOVERED_LENGTH);
// 					pRecImg = pRecImg + SUBFRAME_B_RECOVERED_LENGTH;
//no
				}


			}	
			
				
			if(nSubFramecont < (SUBFRAME_NUM_OF_FRAME - 1))//SubFrame type A;
			{
				for (arrPackNumcout=0;arrPackNumcout < PACKET_OF_SUBFRAME_A;arrPackNumcout++)
				{
					arrPackNumA[arrPackNumcout]=0;
				}
				
				pSubFrameAStart = pThis->SubFrameAStart;
				memset(pSubFrameAStart,0,SUBFRAME_A_LENGTH_AFTER_RSDEC);				
				memcpy(pSubFrameAStart,pStrAfterRSDec,SUBFRAME_A_LENGTH_AFTER_RSDEC);


				//After memcpy,pSubFrameAStart is at the start of the data block;
				//the position of pStrAfterRSDec dose not change.
				

				//11.21 modified here;
				nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
				arrPackNumcout=0;//清零
				//take care -1	
				while (nPacketNum < PACKET_OF_SUBFRAME_A && !bSubFrameErrFlag&&!bFrameErrFlag)//包循环,从 1 开始计数
				{													
						
					if (!bSubFrameErrFlag&&!bFrameErrFlag)
					{							
						arrPackNumA[arrPackNumcout]=nPacketNum;	//记录包计数						
						arrPackNumcout++;
						pStrAfterRSDec=pStrAfterRSDec+PACKET_AFTER_RSDEC_LENGTH;	
						nPacketNum=(*(pStrAfterRSDec+PACKET_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+PACKET_NUM_HIGH_OFFSET))*256)/4;
					}

					//如果帧计数出错,跳出
					if (nFrameNum!=*(pStrAfterRSDec+FRAME_NUM_LOW_OFFSET)+(*(pStrAfterRSDec+FRAME_NUM_HIGH_OFFSET))*16)
					{							
						bFrameErrFlag=1;
					}
					
					//如果子帧计数出错,跳出
					if (nSubFramecont!=*(pStrAfterRSDec+SUBFRAME_NUM_OFFSET))
					{							
						bSubFrameErrFlag=1;
					}	
				}
				if (!bFrameErrFlag)
				{
					nLastPackOfNoErrStream=pThis->TreatPackNumErrA(arrPackNumA);

					if (nLastPackOfNoErrStream < PACKET_OF_SUBFRAME_A - 1)//Packet Lost;
					{
						//add error report
						fprintf(fErrorReport,"%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_A - 2 - nLastPackOfNoErrStream,nSubFramecont);
						TRACE("%d packets of Subframe%d lost\n",PACKET_OF_SUBFRAME_A -2 - nLastPackOfNoErrStream,nSubFramecont);
					}

					pSubFrameAToSpDec = pThis->SubFrameAToSpDec;//To point the pointer; 
					memset(pSubFrameAToSpDec,0,SUBFRAME_A_TO_SPDEC_LENGTH);
 					nSpihtStrlen=pThis->FormSpDecStreamA(nLastPackOfNoErrStream,pSubFrameAStart,pSubFrameAToSpDec);
					
					pRecSubImgA = pThis->RecSubImgA;//To point the pointer; 
					memset(pRecSubImgA,0,SUBFRAME_A_RECOVERED_LENGTH);
					
					fnSpDecDll(pSubFrameAToSpDec,pRecSubImgA,nSpihtStrlen);//the start of the block SubFrameBToSpDec is the hold"0d".


						
//for debug vertion,delete the last 8 bytes in each line,change 4016 to 4008;				

					for (nDebugline=1; nDebugline<256; nDebugline++)
					{

⌨️ 快捷键说明

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