📄 rsimage.cpp
字号:
#include "StdAfx.h"
#include "RSImage.h"
#include "Progress.h"
#include "Comput.h"
#include <math.h>
//#define ADDBYTE 14
//#define MAXCOLOR 256
#define PI 3.1415926
// 构造函数
CRSImage::CRSImage()
{
m_pPal = NULL;
//m_bPreview = FALSE;
//m_pNewPal = NULL;
m_nImgHeight = 0;
m_nImgWidth = 0;
m_pdwHistogram = NULL;
m_MinWaveLength = 0;
m_MaxWaveLength = 0;
m_szImgName.Empty();
m_pImgData = NULL;
m_pUndoData = NULL;
m_nImgType = IMAGE_NOTHING;
m_nLinkedImage = 0;
m_nClassNumber = 0;
m_dXResolution = 1.0;
m_dYResolution = 1.0;
m_dwDateOfImage = 0;
// the geo-position of image
// An arbitary impossible value
for(int i=0;i<8;i++)
m_pdGeoPosition[i] = 10000;
}
// 析构函数
CRSImage::~CRSImage()
{
// 释放空间
if(m_pPal != NULL) //调色板
delete []m_pPal;
//if(m_pNewPal != NULL) //预览时的调色板
//delete []m_pNewPal;
if(m_pdwHistogram != NULL) //直方图
delete []m_pdwHistogram;
if(m_pImgData != NULL) //数据块
free(m_pImgData);
if(m_pUndoData != NULL)
delete []m_pUndoData;
// 释放关联图象数组所占的空间
for(int i=0;i<m_nLinkedImage;i++)
{
CString *pszTemp = (CString *)(m_aLinkedImageNameArray[i]);
delete pszTemp;
}
m_aLinkedImageNameArray.RemoveAll();
// 释放专题类别信息数组所占的空间
for(i=0; i<m_nClassNumber; i++)
{
CRsThematicInfo * pRsThematicInfo = m_aThemeInfoArray.GetAt(i);
delete pRsThematicInfo;
}
m_aThemeInfoArray.RemoveAll();
}
/*
// 信息拷贝
void CRSImage::CopyInfoFrom(CRSImage * pRSImage)
{
m_szImgName = pRSImage->m_szImgName;
m_dXResolution = pRSImage->m_dXResolution;
m_dYResolution = pRSImage->m_dYResolution;
for(int m=0; m<8; m++)
m_pdGeoPosition[m] = pRSImage->m_pdGeoPosition[m];
m_dwDateOfImage = pRSImage->m_dwDateOfImage;
m_MinWaveLength = pRSImage->m_MinWaveLength;
m_MaxWaveLength = pRSImage->m_MaxWaveLength;
if(m_pPal == NULL)
{
m_pPal = new COLORREF[pRSImage->m_nClassNumber];
for(int i=0; i<pRSImage->m_nClassNumber; i++)
m_pPal[i]=pRSImage->m_pPal[i];
}
// Histogram,the size is 256*3 for a RGB true color
// image,or the size is 256.
//DWORD * m_pdwHistogram;
m_nLinkedImage = pRSImage->m_nLinkedImage;
m_aLinkedImageNameArray.RemoveAll();
for(int i=0; i<m_nLinkedImage; i++)
{
CString * pszTemp = NULL;
CString * pszTemp1 = (CString *)new CString();
pszTemp = (CString *)pRSImage->m_aLinkedImageNameArray.GetAt(i);
*pszTemp1 = *pszTemp;
m_aLinkedImageNameArray.Add(pszTemp1);
}
m_nClassNumber = pRSImage->m_nClassNumber;
m_aThemeInfoArray.RemoveAll();
for(i=0; i<m_nClassNumber; i++)
{
CRsThematicInfo * pRsThematicInfo = pRSImage->m_aThemeInfoArray.GetAt(i);
CRsThematicInfo * pRsThematicInfo1 = new CRsThematicInfo();
pRsThematicInfo1->m_clrColor = pRsThematicInfo->m_clrColor;
pRsThematicInfo1->m_nValue = pRsThematicInfo->m_nValue;
pRsThematicInfo1->m_szClassName = pRsThematicInfo->m_szClassName;
if(pRsThematicInfo->m_pdCenter != NULL)
{
pRsThematicInfo1->m_pdCenter = (double *)new double[m_nLinkedImage];
for(int j=0; j<m_nLinkedImage; j++)
{
pRsThematicInfo1->m_pdCenter[j] = pRsThematicInfo->m_pdCenter[j];
}
}
if(pRsThematicInfo->m_pdCovariance != NULL)
{
pRsThematicInfo1->m_pdCovariance = (double *)new double[m_nLinkedImage*m_nLinkedImage];
for(int j=0; j<m_nLinkedImage*m_nLinkedImage; j++)
{
pRsThematicInfo1->m_pdCovariance[j] = pRsThematicInfo->m_pdCovariance[j];
}
}
m_aThemeInfoArray.Add(pRsThematicInfo1);
}
}
*/
void CRSImage::CopyThematicInfo(CRSImage * pRSImage)
{
// 清空
for(int i=0; i<m_nClassNumber; i++)
{
CRsThematicInfo * pRsThematicInfo = m_aThemeInfoArray.GetAt(i);
delete pRsThematicInfo;
}
m_aThemeInfoArray.RemoveAll();
// 复制
m_nClassNumber = pRSImage->m_nClassNumber;
for(i=0; i<m_nClassNumber; i++)
{
CRsThematicInfo * pRsThematicInfo = pRSImage->m_aThemeInfoArray.GetAt(i);
CRsThematicInfo * pRsThematicInfo1 = new CRsThematicInfo();
pRsThematicInfo1->m_clrColor = pRsThematicInfo->m_clrColor;
pRsThematicInfo1->m_nValue = pRsThematicInfo->m_nValue;
pRsThematicInfo1->m_szClassName = pRsThematicInfo->m_szClassName;
if(pRsThematicInfo->m_pdCenter != NULL &&
pRSImage->m_nLinkedImage != 0)
{
pRsThematicInfo1->m_pdCenter = (double *)new double[m_nLinkedImage];
for(int j=0; j<m_nLinkedImage; j++)
{
pRsThematicInfo1->m_pdCenter[j] = pRsThematicInfo->m_pdCenter[j];
}
}
if(pRsThematicInfo->m_pdCovariance != NULL &&
pRSImage->m_nLinkedImage != 0)
{
pRsThematicInfo1->m_pdCovariance = (double *)new double[m_nLinkedImage*m_nLinkedImage];
for(int j=0; j<m_nLinkedImage*m_nLinkedImage; j++)
{
pRsThematicInfo1->m_pdCovariance[j] = pRsThematicInfo->m_pdCovariance[j];
}
}
m_aThemeInfoArray.Add(pRsThematicInfo1);
}
}
// 从文件中装载全部影象数据块
BOOL CRSImage::LoadWholeImage(CFile * file,int srcHeight,int srcWidth)
{
int nBmpColNum;
int nLineWidth;
int Process=0;
int RPro;
int i,j;
m_nImgHeight = srcHeight;
m_nImgWidth = srcWidth;
if(m_nImgType != IMAGE_COMBINE)
{
nBmpColNum = (m_nImgWidth+3)/4*4;
nLineWidth = srcWidth;
}
else
{
nBmpColNum = (m_nImgWidth*3+3)/4*4;
nLineWidth = srcWidth*3;
}
m_pImgData = new BYTE[nBmpColNum*m_nImgHeight];
if(m_pImgData == NULL)
{
AfxMessageBox("申请内存空间失败!");
return FALSE;
}
for(i = 0; i < m_nImgHeight; i++)
{
RPro = (int)(100.0 * (i+1) / m_nImgHeight);
if(RPro > Process)
{
for(j=0; j < RPro-Process; j++)
UpdateStatusBar();
Process = RPro;
}
file->Read(m_pImgData+(m_nImgHeight-i-1)*nBmpColNum,nLineWidth);
}
return TRUE;
}
// 从文件中装载遥感影象
BOOL CRSImage::LoadRsImage(CFile *file, int srcHeight, int srcWidth,
int nBeginX, int nBeginY,
int Height, int Width, int nResRatio)
{
int nBmpColNum;
int nLineWidth;
BYTE * pbLine;
if(nBeginX==0 && nBeginY==0 && Height==0 ||
Width==0 && nResRatio==1)
return LoadWholeImage(file,srcHeight,srcWidth);
if(Height==0)
Height = srcHeight;
if(Width==0)
Width = srcWidth;
ASSERT(nBeginX+Width <= srcWidth && nBeginY+Height <= srcHeight);
m_nImgHeight = Height/nResRatio;
m_nImgWidth = Width/nResRatio;
if(m_nImgType != IMAGE_COMBINE)
{
nBmpColNum = (m_nImgWidth+3)/4*4;
nLineWidth = srcWidth;
pbLine = new BYTE[srcWidth];
ASSERT(pbLine != NULL);
}
else
{
nBmpColNum = (m_nImgWidth*3+3)/4*4;
nLineWidth = srcWidth*3;
pbLine = new BYTE[srcWidth*3];
ASSERT(pbLine != NULL);
}
m_pImgData = new BYTE[nBmpColNum*m_nImgHeight];
if(m_pImgData == NULL)
{
AfxMessageBox("申请内存失败!");
return FALSE;
}
int Process=0;
int RPro;
int i,j;
for(i=0; i < m_nImgHeight; i++)
{
RPro=(int)(100.0 * (i+1) / m_nImgHeight);
if(RPro>Process)
{
for(j=0; j < RPro-Process; j++)
UpdateStatusBar();
Process=RPro;
}
file->Seek(nLineWidth*(i*nResRatio+nBeginY),CFile::begin);
file->Read(pbLine,nLineWidth);
if(m_nImgType != IMAGE_COMBINE)
{
for(j=0; j<m_nImgWidth; j++)
{
m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j] =
pbLine[j*nResRatio+nBeginX];
}
}
else
{
for(j=0; j<m_nImgWidth; j++)
{
m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j*3] =
pbLine[(j*nResRatio+nBeginX)*3];
m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j*3+1] =
pbLine[(j*nResRatio+nBeginX)*3+1];
m_pImgData[(m_nImgHeight-i-1)*nBmpColNum+j*3+2] =
pbLine[(j*nResRatio+nBeginX)*3+2];
}
}
}
delete pbLine;
pbLine = NULL;
return TRUE;
}
// 保存遥感影象(要求文件以可写方式打开,操作后不关闭)
BOOL CRSImage::SaveRsImage(CFile *file)
{
int nBmpColNum;
int nTheWidth;
// 计算图象宽度
if(m_nImgType == IMAGE_COMBINE)
{
nBmpColNum = (m_nImgWidth*3+3)/4*4;
nTheWidth = m_nImgWidth*3;
}
else
{
nBmpColNum = (m_nImgWidth+3)/4*4;
nTheWidth = m_nImgWidth;
}
// 写数据块
TRY
{
for(int i=m_nImgHeight-1;i>=0;i--)
{
file->Write((m_pImgData+i*nBmpColNum),nTheWidth);
}
}
CATCH( CFileException, e ) //Some error
{
AfxMessageBox("写文件时出错!");
return FALSE;
}
END_CATCH
return TRUE;
}
// 获取遥感影象信息(要求文件以可读方式打开,操作后不关闭)
BOOL CRSImage::LoadRsInfo(CFile * infFile)
{
TRY
{
DWORD dwFlag; //文件标志
infFile->Read(&dwFlag,sizeof(DWORD));
if(dwFlag != HEADERFLAG)
return FALSE;
infFile->Read(&m_nImgType,sizeof(int)); //文件类型
char szName[256]; //文件名字
infFile->Read(szName,256);
m_szImgName = szName;
infFile->Read(&m_dwDateOfImage,sizeof(DWORD)); //成象日期
infFile->Read(&m_MinWaveLength,sizeof(BYTE)); //成象波长
infFile->Read(&m_MaxWaveLength,sizeof(BYTE));
infFile->Read(&m_nImgWidth,sizeof(int)); //宽
infFile->Read(&m_nImgHeight,sizeof(int)); //高
infFile->Read(&m_dXResolution,sizeof(double)); //水平分辨率
infFile->Read(&m_dYResolution,sizeof(double)); //垂直分辨率
for(int i=0; i<8; i++) //地理分布范围
{
infFile->Read(m_pdGeoPosition+i,sizeof(double));
}
infFile->Seek(10*sizeof(DWORD),CFile::current); //保留字节40
if(m_nImgType == IMAGE_COMBINE) //直方图信息
{
if(m_pdwHistogram == NULL)
{
m_pdwHistogram = new DWORD[3*256];
ASSERT(m_pdwHistogram != NULL);
}
infFile->Read(m_pdwHistogram,sizeof(DWORD)*3*256);
}
else
{
if(m_pdwHistogram == NULL)
{
m_pdwHistogram = new DWORD[256];
ASSERT(m_pdwHistogram != NULL);
}
infFile->Read(m_pdwHistogram,sizeof(DWORD)*256);
}
}
CATCH( CFileException, e ) //Some error
{
AfxMessageBox("读文件出错!");
return FALSE;
}
END_CATCH
infFile->Read(&m_nLinkedImage,sizeof(int)); //连接的图象
ASSERT(m_nLinkedImage>=0);
CString * pszTemp;
char szText[256];
int i;
for(i=0; i<m_nLinkedImage; i++)
{
pszTemp = new CString();
infFile->Read(szText,256);
*pszTemp = szText;
m_aLinkedImageNameArray.Add(pszTemp);
}
if(m_nImgType == IMAGE_THEMATIC) //类别信息
{
infFile->Read(&m_nClassNumber,sizeof(int));
CRsThematicInfo *pInfo;
for(i=0; i<m_nClassNumber; i++)
{
pInfo = new CRsThematicInfo();
TRY
{
infFile->Read(&(pInfo->m_nValue),sizeof(int));
infFile->Read(szText,256);
pInfo->m_szClassName = szText;
infFile->Read(&(pInfo->m_clrColor),sizeof(COLORREF));
pInfo->m_pdCenter = new double[m_nLinkedImage];
infFile->Read(pInfo->m_pdCenter,sizeof(double)*m_nLinkedImage);
pInfo->m_pdCovariance = new double[m_nLinkedImage*m_nLinkedImage];
infFile->Read(pInfo->m_pdCovariance,sizeof(double)*m_nLinkedImage*m_nLinkedImage);
m_aThemeInfoArray.Add(pInfo);
}
CATCH( CFileException, e ) //Some error
{
AfxMessageBox("读文件出错!");
return FALSE;
}
END_CATCH
}
}
return TRUE;
}
// 保存遥感影象信息(要求文件已经打开,操作后不关闭)
BOOL CRSImage::SaveRsInfo(CFile * infFile)
{
int i;
TRY
{
// 写标志、影象类型、影象名字、成象日期和成象波长范围
DWORD dwFlag = HEADERFLAG;
infFile->Write(&dwFlag,sizeof(DWORD));
infFile->Write(&m_nImgType,sizeof(int));
infFile->Write(m_szImgName.GetBuffer(256),256);
infFile->Write(&m_dwDateOfImage,sizeof(DWORD));
infFile->Write(&m_MinWaveLength,sizeof(BYTE));
infFile->Write(&m_MaxWaveLength,sizeof(BYTE));
// 写宽、高、水平分辨率和垂直分辨率
infFile->Write(&m_nImgWidth,sizeof(int));
infFile->Write(&m_nImgHeight,sizeof(int));
infFile->Write(&m_dXResolution,sizeof(double));
infFile->Write(&m_dYResolution,sizeof(double));
// 写地理分布范围
for(i=0; i<8; i++)
{
infFile->Write(m_pdGeoPosition+i,sizeof(double));
}
// 写保留字节
DWORD dwReserved = 0L;
for(i=0; i<10; i++)
{
infFile->Write(&dwReserved,sizeof(DWORD));
}
// 写直方图信息
if(m_pdwHistogram == NULL)
{
CalHistogram();
}
if(m_nImgType == IMAGE_COMBINE)
infFile->Write(m_pdwHistogram,sizeof(DWORD)*3*256);
else
infFile->Write(m_pdwHistogram,sizeof(DWORD)*256);
}
CATCH( CFileException, e )
{
AfxMessageBox("写文件时出错!");
return FALSE;
}
END_CATCH
// 写连接的影象信息
CString * pszTemp;
infFile->Write(&m_nLinkedImage,sizeof(int));
for(i=0; i<m_nLinkedImage; i++)
{
pszTemp = (CString *)(m_aLinkedImageNameArray[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -