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

📄 hyperspectraldatauncompressdlg.cpp

📁 改进的JPEG-LS算法
💻 CPP
📖 第 1 页 / 共 3 页
字号:
void CHyperspectralDataUnCompressDlg::OnDestroy()
{
	CDialog::OnDestroy();
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CHyperspectralDataUnCompressDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CHyperspectralDataUnCompressDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CHyperspectralDataUnCompressDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	CDialog::OnClose();
}

void CHyperspectralDataUnCompressDlg::OnKillfocusCompressFileName() 
{
	if(LoadHyperspectralCompressHead(m_CompressFileName)==TRUE)
	{
		IsHyperspectralCompressData=TRUE;
		GetDlgItem(IDC_CONSTRUCT_IMAGE_FILE_NAME)->EnableWindow(IsHyperspectralCompressData);
		GetDlgItem(IDC_CONSTRUCT_FILENAME_FIND_BUTTON)->EnableWindow(IsHyperspectralCompressData);
		ProduceConstructFileName();
	}
}
void CHyperspectralDataUnCompressDlg::ProduceConstructFileName(LPCTSTR lpInputConstructFileName)
{//由压缩文件名产生默认的重建图像文件名
	if(IsHyperspectralCompressData==FALSE)return;
	CString s;
	int i,BandNumber;
	TCHAR asc[256];
	strcpy(asc,(LPCTSTR)m_CompressFileName);
	BandNumber=atoi((LPCTSTR)m_BandNumber);
	if(asc[m_CompressFileName.GetLength()-4]=='.')
	{
		if(AllowReport==TRUE)asc[m_CompressFileName.GetLength()-6]='\0';
		else asc[m_CompressFileName.GetLength()-4]='\0';
	}
	if(lpInputConstructFileName==NULL)m_ConstuctFileName=asc;
	else m_ConstuctFileName=lpInputConstructFileName;
	if(HyperspectralDataFormat==BFILE)
	{//纯图像格式时
		for(i=0;i<BandNumber;i++)
		{
			s.Format(_T("C%03d.RAW"),i);
			lpConstructFile[i]=m_ConstuctFileName;
			lpConstructFile[i]+=s;
		}
		CanUnCompress=TRUE;
	}
	else if(HyperspectralDataFormat==BSQ_H)
	{
		s=_T("C.BSQ");
		m_ConstuctFileName+=s;
		CanUnCompress=TRUE;
	}
	else if(HyperspectralDataFormat==BIP_H)
	{
		s=_T("C.BIP");
		m_ConstuctFileName+=s;
		CanUnCompress=TRUE;
	}
	else if(HyperspectralDataFormat==BIL_H)
	{
		s=_T("C.BIL");
		m_ConstuctFileName+=s;
		CanUnCompress=TRUE;
	}
	UpdateData(FALSE);
}
char szFilter_CompressFile[] = "压缩数据(*.CMP)\0*.cmp\0全部文件 (*.*) \0*.*\0\0";
void CHyperspectralDataUnCompressDlg::OnCompressFilenameFindButton() 
{
	// 查找压缩数据文件
	UpdateData(TRUE);
	LPSTR lpBuf=new TCHAR[16388];
	strcpy(lpBuf,(LPCTSTR)m_CompressFileName);
	if((CompressFileNumbers=::FindFileNameOpreation(TRUE,lpBuf,szFilter_CompressFile,MAX_COMPRESS_FILE_NUMBER,lpCompressFile,16384))>=1)
	{//多文件存放在串列表中
		m_CompressFileName=lpBuf;
		if(CompressFileNumbers>1)
		{
			m_CompressFileName=lpCompressFile[0];
			Report=_T("误差界  压缩比  压缩码率  峰值信噪比\r\n");
			AllowReport=TRUE;
			CompleteUnCompressFileNumber=0;
		}
		else
		{
			CompleteUnCompressFileNumber=0;
			AllowReport=FALSE;
			Report.Empty();
		}

		if(LoadHyperspectralCompressHead(m_CompressFileName)==TRUE)
		{
			IsHyperspectralCompressData=TRUE;
			GetDlgItem(IDC_CONSTRUCT_IMAGE_FILE_NAME)->EnableWindow(IsHyperspectralCompressData);
			GetDlgItem(IDC_CONSTRUCT_FILENAME_FIND_BUTTON)->EnableWindow(IsHyperspectralCompressData);
			ProduceConstructFileName();
			UpdateData(FALSE);
		}
		else GotoDlgCtrl(GetDlgItem(IDC_COMPRESS_FILE_NAME));
	}
	delete lpBuf;
}
BOOL CHyperspectralDataUnCompressDlg::LoadHyperspectralCompressHead(CString &CompressFile)//加载压缩头
{
	stAuxMsg *lpHead;
	LPBYTE lpCS;
	CFile f;
	int Height,OneLineAuxDataWidth;
	TCHAR OnePixelBits;
	unsigned char Maxerr;
	short int *lpPredict;
	BOOL AllowBandPredict;
	int HHeadSize,i;
	CString s;
	if(::TestTheFileExist((LPCTSTR)CompressFile)==TRUE)
	{
		if(f.Open((LPCTSTR)CompressFile,CFile::modeRead)==TRUE)
		{//打开多波段文件
			lpCS=new BYTE[16+MAXBANDNUMBER*2+sizeof(stAuxMsg)];
			f.Read(lpCS,16+MAXBANDNUMBER*2+sizeof(stAuxMsg));
			BandNumber=*((short int *)(lpCS+1));//波段数
			if((lpCS[0]==BSQ_H||lpCS[0]==BIP_H||lpCS[0]==BIL_H||lpCS[0]==BFILE)&&(BandNumber>0&&BandNumber<=MAXBANDNUMBER))
			{//如果是指定的四种格式
				HyperspectralDataFormat=lpCS[0];
				Width=*((short int *)(lpCS+3));//图像宽度
				Height=*((short int *)(lpCS+5));//图像高度
				if(HyperspectralDataFormat==BFILE)
				{//纯图像格式时
					OnePixelBits=*((char *)(lpCS+7));//单象素字节数
					BytesPerPixel=*((char *)(lpCS+8));//单象素数比特数
					lpPredict=(short int *)(lpCS+9);
					OneLineAuxDataWidth=0;
					m_ImageFormat=_T("纯图象");
					HHeadSize=9+BandNumber*sizeof(short int);
					Maxerr=*((char *)(lpCS+HHeadSize+4));//存放于压缩块头中的误差界
				}
				else
				{
					lpPredict=(short int *)(lpCS+7);
					lpHead=(stAuxMsg *)(lpCS+7+BandNumber*sizeof(short int));
					OneLineAuxDataWidth=lpHead->iImageWidth-Width;
					OnePixelBits=lpHead->iBitPerPixel;
					if(OnePixelBits<=8)BytesPerPixel=1;
					else BytesPerPixel=2;
					if(lpCS[0]==BSQ_H)m_ImageFormat=_T("高光谱(BSQ_H)");
					else if(lpCS[0]==BIP_H)m_ImageFormat=_T("高光谱(BIP_H)");
					else if(lpCS[0]==BIL_H)m_ImageFormat=_T("高光谱(BIL_H)");
					HHeadSize=7+BandNumber*sizeof(short int)+sizeof(stAuxMsg)+
						lpHead->stLineAuxDataInfo.ladHeight*lpHead->stLineAuxDataInfo.ladWidth;
					f.Seek(HHeadSize+4,CFile::begin);
					f.Read(&Maxerr,1);//读取存放于压缩块头中的误差界
				}
				m_AuxWidth.Format(_T("%d"),OneLineAuxDataWidth);
				m_BandNumber.Format(_T("%d"),BandNumber);
				m_BitsPerPixel.Format(_T("%d"),OnePixelBits);
				m_ImageHeight.Format(_T("%d"),Height);
				m_ImageWidth.Format(_T("%d"),Width);
				m_MaxErrPerPixel.Format(_T("%u"),Maxerr);
				for(i=0,PredictBandList.Empty(),AllowBandPredict=FALSE;i<BandNumber;i++)
				{
					if(lpPredict[i]>=0&&lpPredict[i]<BandNumber)
					{
						AllowBandPredict=TRUE;
						s.Format(_T("%d "),lpPredict[i]);
						PredictBandList+=s;
					}
					else PredictBandList+=_T("-1 ");
				}
				if(AllowBandPredict==TRUE)m_BandPrediction=_T("ON");
				else m_BandPrediction=_T("OFF");
				f.Close();
				delete lpCS;
				return TRUE;
			}
			else
			{
				f.Close();
				delete lpCS;
			}
		}
	}
	return FALSE;
}

void CHyperspectralDataUnCompressDlg::OnAllowCompareCheck() 
{
	UpdateData(TRUE);
	GetDlgItem(IDC_IMAGE_FILE_NAME)->EnableWindow(m_AllowCompare);
	GetDlgItem(IDC_MULBAND_IMAGE_FILENAME_FIND_BUTTON)->EnableWindow(m_AllowCompare);
}
char szFilter_HyperspectralFile[] = "高光谱图象(*.BSQ;*.BIP;*.BIL;*.RAW)\0*.bsq;*.bip;*.bil;*.raw;\0全部文件 (*.*) \0*.*\0\0";
void CHyperspectralDataUnCompressDlg::OnMulbandImageFilenameFindButton() 
{//浏览用于比较的原始高光谱图像
	int FileNumber;
	LPCTSTR Exfilename;
	UpdateData(TRUE);
	LPSTR lpBuf=new TCHAR[16388];
	stAuxMsg *lpHead;
	CFile f;
	strcpy(lpBuf,(LPCTSTR)m_ImageFileName);
	if((FileNumber=::FindFileNameOpreation(TRUE,lpBuf,szFilter_HyperspectralFile,MAXBANDNUMBER,lpImageFile,16384))>=1)
	{//多文件存放在串列表中
		m_ImageFileName=lpBuf;

		Exfilename=((LPCTSTR)lpImageFile[0])+lpImageFile[0].GetLength()-3;
		if((strcmp(Exfilename,_T("raw"))==0||strcmp(Exfilename,_T("RAW"))==0)&&HyperspectralDataFormat==BFILE)
		{//纯图像格式
			if(FileNumber==atoi((LPCTSTR)m_BandNumber))
			{
				CanCompare=TRUE;
				ArrangeFileName(lpImageFile,FileNumber);
			}
		}
		else if(HyperspectralDataFormat==BSQ_H||HyperspectralDataFormat==BIP_H||HyperspectralDataFormat==BIL_H)
		{
			if(f.Open((LPCTSTR)lpImageFile[0],CFile::modeRead)==TRUE)
			{//打开多波段文件
				f.Read(lpBuf,sizeof(stAuxMsg));
				f.Close();
				lpHead=(stAuxMsg *)lpBuf;
				if(atoi((LPCTSTR)m_BandNumber)==lpHead->iImageBand&&
					atoi((LPCTSTR)m_ImageHeight)==lpHead->iImageHeight)
				{
					CanCompare=TRUE;
				}
			}
		}
		UpdateData(FALSE);
	}
	delete lpBuf;
}
char szFilter_ConstructFile[] = "高光谱图象(*.BSQ;*.BIP;*.BIL;*.RAW)\0*.bsq;*.bip;*.bil;*.raw;\0全部文件 (*.*) \0*.*\0\0";
void CHyperspectralDataUnCompressDlg::OnConstructFilenameFindButton() 
{//浏览重建图像
	int FileNumber;
	LPCTSTR Exfilename;
	UpdateData(TRUE);
	LPSTR lpBuf=new TCHAR[16388];
	CFile f;
	strcpy(lpBuf,(LPCTSTR)m_ConstuctFileName);
	if((FileNumber=::FindFileNameOpreation(FALSE,lpBuf,szFilter_HyperspectralFile,MAXBANDNUMBER,lpConstructFile,16384))>=1)
	{//多文件存放在串列表中
		m_ConstuctFileName=lpBuf;

		Exfilename=((LPCTSTR)lpConstructFile[0])+lpConstructFile[0].GetLength()-3;
		if((strcmp(Exfilename,_T("raw"))==0||strcmp(Exfilename,_T("RAW"))==0)&&HyperspectralDataFormat==BFILE)
		{//纯图像格式
			if(FileNumber==atoi((LPCTSTR)m_BandNumber))
			{
				CanUnCompress=TRUE;
				ArrangeFileName(lpConstructFile,FileNumber);
			}
		}
		else if(HyperspectralDataFormat==BSQ_H||HyperspectralDataFormat==BIP_H||HyperspectralDataFormat==BIL_H)
		{
			CanUnCompress=TRUE;
		}
		UpdateData(FALSE);
		ProduceConstructFileName((LPCTSTR)m_ConstuctFileName);
		GotoDlgCtrl(GetDlgItem(IDC_CONSTRUCT_IMAGE_FILE_NAME));
	}
	delete lpBuf;
}

void CHyperspectralDataUnCompressDlg::OnKillfocusConstructImageFileName() 
{
	UpdateData(TRUE);
	ProduceConstructFileName((LPCTSTR)m_ConstuctFileName);
}

void CHyperspectralDataUnCompressDlg::OnUncompressCancel() 
{
	if(UnCompressThreadRun==TRUE)UnCompressThreadRun=FALSE;
	else PostMessage(WM_CLOSE,0,0);
}

void CHyperspectralDataUnCompressDlg::OnUncompressOk() 
{
	UpdateData(TRUE);
	if(CanUnCompress==FALSE)
	{
		MessageBeep(0xffffffff);
		MessageBox(_T("压缩文件名或重建文件名输入有误!!!"));
		return;
	}
	if(m_AllowCompare==TRUE)
	{
		if(CanCompare!=TRUE)
		{
			MessageBeep(0xffffffff);
			MessageBox(_T("请重新输入用于比较的原始图像文件名"));
			GotoDlgCtrl(GetDlgItem(IDC_IMAGE_FILE_NAME));
			return;
		}
	}
	m_MaxError.Empty();
	m_PSNRString.Empty();
	m_RateString.Empty();
	m_CompressRate.Empty();
	UnCompressComplete=FALSE;
	GetDlgItem(IDC_UNCOMPRESS_OK)->EnableWindow(FALSE);
	GetDlgItem(IDC_COMPRESS_FILE_NAME)->EnableWindow(FALSE);
	GetDlgItem(IDC_COMPRESS_FILENAME_FIND_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_MULBAND_IMAGE_FILENAME_FIND_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_CONSTRUCT_FILENAME_FIND_BUTTON)->EnableWindow(FALSE);
	GetDlgItem(IDC_ALLOW_COMPARE_CHECK)->EnableWindow(FALSE);

⌨️ 快捷键说明

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