📄 hyperspectraldatauncompressdlg.cpp
字号:
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 + -