📄 rsipview.cpp
字号:
}
}
CRSIPApp * theApp=(CRSIPApp *)AfxGetApp();
CRSImage *pNewRsImage = new CRSImage();
pNewRsImage->m_pImgData = pData;
pNewRsImage->m_nImgHeight = height;
pNewRsImage->m_nImgWidth = width;
pNewRsImage->m_nImgType = IMAGE_COMBINE;
theApp->CreateNewImageDoc(pNewRsImage,"未命名合成影象");
}
}
void CRSIPView::OnImageHistogram()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if( pDoc->m_pRSImage == NULL ||
pDoc->m_pRSImage->m_pImgData == NULL )
return;
if( pDoc->m_pRSImage->m_nImgType == IMAGE_THEMATIC )
{
MessageBox("专题图像的直方图无意义!");
return;
}
HistogramDlg HistoDlg(this);
HistoDlg.m_dwPixels = pDoc->m_pRSImage->m_nImgHeight
* pDoc->m_pRSImage->m_nImgWidth;
HistoDlg.m_nImageType = pDoc->m_pRSImage->m_nImgType;
//if(pDoc->m_pRSImage->m_pdwHistogram == NULL ||
pDoc->m_bHistogramModified /*==*/= TRUE;
//)
//{
pDoc->m_pRSImage->CalHistogram();
pDoc->m_bHistogramModified = FALSE;
//}
HistoDlg.m_pdwHistogram = pDoc->m_pRSImage->m_pdwHistogram;
HistoDlg.DoModal();
}
void CRSIPView::OnImageInfomation()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
CImgInfoSheet infoSheet("");
infoSheet.SetTitle("影象信息");
infoSheet.m_GeneralInfo.m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
infoSheet.m_GeneralInfo.m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
infoSheet.m_GeneralInfo.m_dHResolution = pDoc->m_pRSImage->m_dXResolution;
infoSheet.m_GeneralInfo.m_dVResolution = pDoc->m_pRSImage->m_dYResolution;
infoSheet.m_GeneralInfo.m_szImgName = pDoc->m_pRSImage->m_szImgName;
infoSheet.m_GeneralInfo.m_dwDate = pDoc->m_pRSImage->m_dwDateOfImage;
infoSheet.m_GeneralInfo.m_nImgType = pDoc->m_pRSImage->m_nImgType-1;
infoSheet.m_GeneralInfo.m_MinWaveLength = pDoc->m_pRSImage->m_MinWaveLength;
infoSheet.m_GeneralInfo.m_MaxWaveLength = pDoc->m_pRSImage->m_MaxWaveLength;
for(int i=0; i<8; i++)
{
infoSheet.m_LocationInfo.m_pGeoPosi[i] = pDoc->m_pRSImage->m_pdGeoPosition[i];
}
CString * pszTemp;
CString * pszTmp;
for(i=0; i<infoSheet.m_LinkedImgPage.m_aLinkedImageArray.GetSize(); i++)
{
pszTemp = (CString *)infoSheet.m_LinkedImgPage.m_aLinkedImageArray.GetAt(i);
delete pszTemp;
infoSheet.m_LinkedImgPage.m_aLinkedImageArray.RemoveAt(i);
}
infoSheet.m_LinkedImgPage.m_nImageCount = pDoc->m_pRSImage->m_nLinkedImage;
for(i=0; i<infoSheet.m_LinkedImgPage.m_nImageCount;i++)
{
pszTemp = (CString *)pDoc->m_pRSImage->m_aLinkedImageNameArray.GetAt(i);
pszTmp = new CString();
*pszTmp = *pszTemp;
infoSheet.m_LinkedImgPage.m_aLinkedImageArray.Add(pszTmp);
}
infoSheet.m_LinkedImgPage.m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
infoSheet.m_LinkedImgPage.m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
if(infoSheet.DoModal()==IDOK)
{
pDoc->m_pRSImage->m_nImgWidth = infoSheet.m_GeneralInfo.m_nImgWidth;
pDoc->m_pRSImage->m_nImgHeight = infoSheet.m_GeneralInfo.m_nImgHeight;
pDoc->m_pRSImage->m_dXResolution = infoSheet.m_GeneralInfo.m_dHResolution;
pDoc->m_pRSImage->m_dYResolution = infoSheet.m_GeneralInfo.m_dVResolution;
pDoc->m_pRSImage->m_dwDateOfImage = infoSheet.m_GeneralInfo.m_dwDate;
pDoc->m_pRSImage->m_szImgName = infoSheet.m_GeneralInfo.m_szImgName;
pDoc->m_pRSImage->m_nImgType = infoSheet.m_GeneralInfo.m_nImgType+1;
pDoc->m_pRSImage->m_MinWaveLength = infoSheet.m_GeneralInfo.m_MinWaveLength;
pDoc->m_pRSImage->m_MaxWaveLength = infoSheet.m_GeneralInfo.m_MaxWaveLength;
for(int i=0; i<8; i++)
{
pDoc->m_pRSImage->m_pdGeoPosition[i] = infoSheet.m_LocationInfo.m_pGeoPosi[i];
}
CString * pszTemp;
CString * pszTmp;
for(i=0; i<pDoc->m_pRSImage->m_aLinkedImageNameArray.GetSize(); i++)
{
pszTemp = (CString *)pDoc->m_pRSImage->m_aLinkedImageNameArray.GetAt(i);
delete pszTemp;
pDoc->m_pRSImage->m_aLinkedImageNameArray.RemoveAt(i);
}
pDoc->m_pRSImage->m_nLinkedImage = infoSheet.m_LinkedImgPage.m_nImageCount;
for(i=0; i<pDoc->m_pRSImage->m_nLinkedImage; i++)
{
pszTemp = (CString *)infoSheet.m_LinkedImgPage.m_aLinkedImageArray.GetAt(i);
pszTmp = new CString();
*pszTmp = *pszTemp;
pDoc->m_pRSImage->m_aLinkedImageNameArray.Add(pszTmp);
}
}
}
}
void CRSIPView::OnImageResample()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
CResampleDlg resampleDlg;
resampleDlg.m_nOriginHeight = pDoc->m_pRSImage->m_nImgHeight;
resampleDlg.m_nOriginWidth = pDoc->m_pRSImage->m_nImgWidth;
if(resampleDlg.DoModal() == IDOK)
{
int nResHeight = resampleDlg.m_nResultHeight;
int nResWidth = resampleDlg.m_nResultWidth;
int nMethod = resampleDlg.m_nMethod;
pDoc->m_pRSImage->Resample(nResHeight,nResWidth,nMethod);
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = TRUE;
}
}
}
void CRSIPView::OnImageHflip()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
pDoc->m_pRSImage->HoriFlip();
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = FALSE;
}
}
void CRSIPView::OnImageVflip()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
pDoc->m_pRSImage->VertFlip();
pDoc->UpdateAllViews(NULL);
pDoc->m_bModifiedFlag = TRUE;
pDoc->m_bHistogramModified = FALSE;
}
}
void CRSIPView::OnImageIhsdecompose()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
int nHeight = pDoc->m_pRSImage->m_nImgHeight;
int nWidth = pDoc->m_pRSImage->m_nImgWidth;
int nBmpCol = (pDoc->m_pRSImage->m_nImgWidth+3)/4*4;
LPBYTE ppResult[3];
for(int i=0; i<3; i++)
{
ppResult[i] = (BYTE *)new BYTE[nBmpCol*nHeight];
if(NULL == ppResult[i])
{
for(int j=0; i<i; j++)
{
delete ppResult[j];
ppResult[j] = NULL;
}
MessageBox("内存不足,无法完成操作!");
return;
}
}
BeginWaitCursor();
int Process=0;
int RPro;
BYTE pIhs[3];
if(pDoc->m_pRSImage->m_nImgType==IMAGE_COMBINE)
{
int nOriBmpCol = (pDoc->m_pRSImage->m_nImgWidth*3+3)/4*4;
for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
{
RPro=(int)(100.0 * (i+1)/ pDoc->m_pRSImage->m_nImgHeight);
if(RPro>Process)
{
for(int j=0;j<RPro-Process;j++)
UpdateStatusBar();
Process=RPro;
}
for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
{
::GetIHS(pIhs,
pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3+2],
pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3+1],
pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3]);
for(int k=0;k<3;k++)
{
ppResult[k][i*nBmpCol+j] = pIhs[k];
}
}
}
}
else
{
BYTE cValue;
for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
{
RPro=(int)(100.0 * (i+1) / pDoc->m_pRSImage->m_nImgHeight);
if(RPro>Process)
{
for(int j=0;j<RPro-Process;j++)
UpdateStatusBar();
Process=RPro;
}
for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
{
cValue = pDoc->m_pRSImage->m_pImgData[i*nBmpCol+j];
::GetIHS(pIhs,
GetRValue(pDoc->m_pRSImage->m_pPal[cValue]),
GetGValue(pDoc->m_pRSImage->m_pPal[cValue]),
GetBValue(pDoc->m_pRSImage->m_pPal[cValue]));
for(int k=0; k<3; k++)
{
ppResult[k][i*nBmpCol+j] = pIhs[k];
}
}
}
}
CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
CString szDocName[3]={"亮度(I)","色调(H)","饱和度(S)"};
for(i=0; i<3; i++)
{
CRSImage *pNewRSImage=new CRSImage();
pNewRSImage->m_pImgData = ppResult[i];
pNewRSImage->m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
pNewRSImage->m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
pNewRSImage->m_nImgType = IMAGE_SINGLEBAND;
theApp->CreateNewImageDoc(pNewRSImage,szDocName[i]);
}
EndWaitCursor();
}
}
void CRSIPView::OnImageRgbdecompose()
{
CRSIPDoc * pDoc = GetDocument();
ASSERT(pDoc != NULL);
if(pDoc->m_pRSImage!=NULL &&
pDoc->m_pRSImage->m_pImgData!=NULL)
{
int nHeight = pDoc->m_pRSImage->m_nImgHeight;
int nWidth = pDoc->m_pRSImage->m_nImgWidth;
int nBmpCol = (pDoc->m_pRSImage->m_nImgWidth+3)/4*4;
LPBYTE ppResult[3];
for(int i=0; i<3; i++)
{
ppResult[i] = (BYTE *)new BYTE[nBmpCol*nHeight];
if(NULL == ppResult[i])
{
for(int j=0; i<i; j++)
{
delete ppResult[j];
ppResult[j] = NULL;
}
MessageBox("内存不足,无法完成操作!");
return;
}
}
BeginWaitCursor();
int Process=0;
int RPro;
if(pDoc->m_pRSImage->m_nImgType == IMAGE_COMBINE)
{
int nOriBmpCol = (pDoc->m_pRSImage->m_nImgWidth*3+3)/4*4;
for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
{
RPro=(int)(100.0 * (i+1) / pDoc->m_pRSImage->m_nImgHeight);
if(RPro>Process)
{
for(int j=0; j<RPro-Process; j++)
UpdateStatusBar();
Process=RPro;
}
for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
{
for(int k=0; k<3; k++)
{
ppResult[k][i*nBmpCol+j] =
pDoc->m_pRSImage->m_pImgData[i*nOriBmpCol+j*3+k];
}
}
}
}
else
{
BYTE cValue;
for(int i=0; i<pDoc->m_pRSImage->m_nImgHeight; i++)
{
RPro=(int)(100.0 * (i+1) / pDoc->m_pRSImage->m_nImgHeight);
if(RPro>Process)
{
for(int j=0; j<RPro-Process; j++)
UpdateStatusBar();
Process=RPro;
}
for(int j=0; j<pDoc->m_pRSImage->m_nImgWidth; j++)
{
cValue = pDoc->m_pRSImage->m_pImgData[i*nBmpCol+j];
ppResult[0][i*nBmpCol+j] = GetRValue(pDoc->m_pRSImage->m_pPal[cValue]);
ppResult[1][i*nBmpCol+j] = GetGValue(pDoc->m_pRSImage->m_pPal[cValue]);
ppResult[2][i*nBmpCol+j] = GetBValue(pDoc->m_pRSImage->m_pPal[cValue]);
}
}
}
CRSIPApp *theApp = (CRSIPApp *)AfxGetApp();
CString szDocName[3] = {"红(R)","绿(G)","蓝(B)"};
for(i=0; i<3; i++)
{
CRSImage *pNewRSImage = new CRSImage();
pNewRSImage->m_pImgData = ppResult[i];
pNewRSImage->m_nImgHeight = pDoc->m_pRSImage->m_nImgHeight;
pNewRSImage->m_nImgWidth = pDoc->m_pRSImage->m_nImgWidth;
pNewRSImage->m_nImgType = IMAGE_SINGLEBAND;
theApp->CreateNewImageDoc(pNewRSImage,szDocName[i]);
}
EndWaitCursor();
}
}
void CRSIPView::OnImageCalculate()
{
CCalcultateImgDlg CalculateDialog(this);
if(CalculateDialog.DoModal() == IDOK)
{
int nImgType = CalculateDialog.m_nImageType;
int Height = CalculateDialog.m_imgHeight;
int Width = CalculateDialog.m_imgWidth;
struct Token *pTheToken = new struct Token[CalculateDialog.m_nTokenCount+1];
for(int i=0; i<CalculateDialog.m_nTokenCount; i++)
pTheToken[i] = CalculateDialog.m_TheToken[i];
int OptrNum = CalculateDialog.m_nOptrCount+2;
int OpndNum = CalculateDialog.m_nOpndCount;
// 增加一个符号
pTheToken[CalculateDialog.m_nTokenCount].Type=DELIMITER;
pTheToken[CalculateDialog.m_nTokenCount].Flag=6;
strcpy(pTheToken[CalculateDialog.m_nTokenCount].Cont,"#\0");
// 操作符与操作数
struct OPTR *Optr = new struct OPTR [OptrNum+2];
struct OPND *Opnd = new struct OPND [OpndNum];
// 当前操作符与操作数
struct OPTR CurOptr;
struct OPND Opnd1,Opnd2;
// 开始计算
int CurCal = 0;
int OptrStkNum = 0;
int OpndStkNum = 0;
Optr[OptrStkNum].Type = DELIMITER;
Optr[OptrStkNum].Flag = 6;// #
OptrStkNum++;
HANDLE Filehp1;
HANDLE Filehp2;
HANDLE Resfh;
CFile File;
int High;
BeginWaitCursor();
for(;;)
{
if(CurCal == CalculateDialog.m_nTokenCount+1)
break;
if(Optr[OptrStkNum-1].Type==DELIMITER && Optr[OptrStkNum-1].Flag==6 &&
pTheToken[CurCal].Type==DELIMITER && pTheToken[CurCal].Flag==6)
break;
if(pTheToken[CurCal].Type==NUMBER || pTheToken[CurCal].Type==ISFILENAME)
{
//Push Opnd Stack
Opnd[OpndStkNum].Type=pTheToken[CurCal].Type;
if(pTheToken[CurCal].Type == NUMBER)
Opnd[OpndStkNum].Number = pTheToken[CurCal].Number;
else
strcpy(Opnd[OpndStkNum].FileName,pTheToken[CurCal].Cont);
CurCal++;
OpndStkNum++;
continue;
}
else
{
CurOptr.Type = pTheToken[CurCal].Type;
CurOptr.Flag = pTheToken[CurCal].Flag;
High = Higher(Optr[OptrStkNum-1],CurOptr);
if(High==-1) //Push Stack
{
Optr[OptrStkNum].Type=CurOptr.Type;
Optr[OptrStkNum].Flag=CurOptr.Flag;
OptrStkNum++;
CurCal++;
continue;
}
else if(High==0) //Pop stack and discard it
{
if(CurOptr.Type==DELIMITER && CurOptr.Flag==1)
OptrStkNum--;
CurCal++;
continue;
}
else if(High==1)
{
//Pop Optr Stack
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -