C++: 打开图像文件并读取头文件信息
void CBsqViewView::OnFileOpen()
{
// TODO: Add your command handler code here
CBsqViewDoc* pDoc = GetDocument();
CFileDialog m_opendlg(TRUE);
CStringArray strc;
CString strt;
CString str06;
if(m_opendlg.DoModal()==IDOK) //激活文件公用对话框
{
m_filename=m_opendlg.GetFileName();//得到文件的文件名
m_pathname=m_opendlg.GetPathName();//得到文件的路径名
header = m_pathname + ".txt";
CFileFind finder;
BOOL bfind = finder.FindFile(header);
if(!m_file.Open(m_pathname,CStdioFile::modeRead|CStdioFile::typeBinary))
{
MessageBeep(MB_ICONINFORMATION);
AfxMessageBox("你不能打开源文件!");
return;
}
m_fileopen = true;
//判断头文件是否存在
if(!bfind)
{
if(Imageinfo.DoModal()==IDOK) //激活输入参数对话框
{
//打开文件操作
CString str01,str02,str03,str04,str05,str06,str07;
CStdioFile headerfile;
str01.Format("bands: %d\n", Imageinfo.m_bands);
str02.Format("samples: %d\n",Imageinfo.m_samples);
str03.Format("lines: %d\n", Imageinfo.m_lines);
if(Imageinfo.DataResult==IDC_FLOAT)
{
//如果数据类型是浮点型
bFloatData = TRUE;
bByteData=false;
floatflag=true;
dataType = FloatType;
//头文件信息
str04.Format("datatype: float\n");
}
if(Imageinfo.DataResult == IDC_BYTE)
{
//如果数据类型是整型
bFloatData=false;
bByteData = TRUE;
byteflag=true;
dataType = ByteType;
//头文件信息
str04.Format("datatype: byte\n");
}
if(Imageinfo.DataResult == IDC_INT)
{
dataType = IntType;
str04.Format("datatype: int\n");
}
if(Imageinfo.FileResult==IDC_STANDARD_IMAGE)
{
//如果文件类型是标准图像
bStandardImage = TRUE;
//头文件信息
str05.Format("filetype: Standard Image\n");
}
if(Imageinfo.FileResult == IDC_TRACE_IMAGE)
{
// btraceimage = TRUE;
str05.Format("filetype: TRACE Image\n");
}
if(Imageinfo.m_bhMODIS)
{
m_bMODIS = TRUE;
str06.Format("sensor type: MODIS");
}
if(Imageinfo.m_bhMSS4)
{
m_bMSS4 = TRUE;
str06.Format("sensor type: MSS4");
}
if(Imageinfo.m_bhMSS5)
{
m_bMSS5 = TRUE;
str06.Format("sensor type: MSS5");
}
if(Imageinfo.m_bhTM4)
{
m_bTM4 = TRUE;
str06.Format("sensor type: TM4");
}
if(Imageinfo.m_bhTM5)
{
m_bTM5 = TRUE;
str06.Format("sensor type: TM5");
}
if(Imageinfo.m_bhTM7)
{
m_bTM7 = TRUE;
str06.Format("sensor type: TM7");
}
if(Imageinfo.m_bhSPOT1)
{
m_bSPOT1 = TRUE;
str06.Format("sensor type: SPOT1");
}
if(Imageinfo.m_bhSPOT4)
{
m_bSPOT4 = TRUE;
str06.Format("sensor type: SPOT4");
}
for(int k = 0;k<=40;k++)
{
ColorChange[k] = Imageinfo.ColorChange[k];
}
if(Imageinfo.FileResult==IDC_CLASSIFICATION_IMAGE)
{
//如果文件类型是分类图像
m_classnum = Imageinfo.m_classnum;
bClassificationImage = TRUE;
//头文件信息
str05.Format("filetype: Classification Image\n");
str07.Format("类别总数: %d\n",m_classnum);
for(int t = 0;t<m_classnum;t++)
{
int r1,g1,b1;
r1 = (int)GetRValue(ColorChange[t]);
g1 = (int)GetGValue(ColorChange[t]);
b1 = (int)GetBValue(ColorChange[t]);
strt.Format("class %d : %d %d %d\n",t+1,r1,g1,b1);
strc.Add(strt);
}
}
headerfile.Open(header,CFile::modeCreate|CFile::modeWrite);
headerfile.WriteString(str01);
headerfile.WriteString(str02);
headerfile.WriteString(str03);
headerfile.WriteString(str04);
headerfile.WriteString(str05);
headerfile.WriteString(str06);
headerfile.WriteString(str07);
for(int e = 0;e<m_classnum;e++)
{
headerfile.WriteString(strc[e]);
}
headerfile.Close();
bfind = TRUE;
}
}
//=================================================================================
//打开图像的部分(读取头文件)
int length;
CFile headfile;
headfile.Open(header,CFile::modeRead);
length = headfile.GetLength();
headfile.Close();
CString hbands,hsamples,hlines,hdatatype,hfiletype,hclassnum,hr,hg,hb,hsensor;
int r,g,b;
r = 0;
g = 100;
b = 100;
char *pIn = new char[length];
fstream fin2(header,ios::in);
//打开挑选波段的对话框
for(int input = 0; input < length; input++)
{
fin2>>pIn;
if(input == 1)
{
hbands=pIn;
}
if(input == 3)
{
hsamples = pIn;
}
if(input == 5)
{
hlines = pIn;
}
if(input == 7)
{
hdatatype = pIn;
}
if(input == 9)
{
hfiletype = pIn;
if(hfiletype == "Classification")
{
bClassificationImage = TRUE;
}
}
if(bClassificationImage)
{
if(input == 12)
{
hclassnum = pIn;
m_classnum = atoi(hclassnum);
}
for(int j = 0;j<m_classnum;j++)
{
if(input == 17+6*j)
{
hg = pIn;
g = atoi(hg);
}
if(input == 16+6*j)
{
hr = pIn;
r = atoi(hr);
}
if(input == 18+6*j)
{
hb = pIn;
b = atoi(hb);
ColorChange[j] = RGB(r,g,b);
}
}
}
else
{
if(input == 13)
{
hsensor = pIn;
}
}
}
//挑选结束
if(hdatatype == "float")
{
bFloatData = TRUE;
dataType = FloatType;
bByteData=false;
floatflag=true;
}
if(hdatatype == "int")
{
dataType = IntType;
bFloatData=false;
}
if(hdatatype == "byte")
{
bByteData = TRUE;
dataType = ByteType;
byteflag=true;
}
if(hfiletype == "Standard")
{
m_bOpenFile = TRUE;
bStandardImage = TRUE;
}
delete pIn;
Bands=atoi(hbands);
bi.biWidth=Width=atoi(hsamples);
bi.biHeight=Height=atoi(hlines);
m_classnum = atoi(hclassnum);
详细解释
内容:该函数是一个菜单命令处理函数,用于打开文件对话框,选择要打开的文件,并读取该文件的头文件信息,然后根据头文件信息打开对应类型的图像文件。
首先获取文档对象指针,然后创建一个文件对话框对象m_opendlg。接着判断用户是否选择了文件,如果选择了文件,则获取文件名和路径名,并根据路径名生成头文件名。然后查找头文件是否存在,如果不存在,则弹出输入参数对话框Imageinfo,用户输入参数后,根据输入的参数信息生成头文件,并写入文件。如果存在,则直接打开图像文件。
接着读取头文件信息,获取图像的波段数、样本数、行数、数据类型、文件类型、类别数、传感器类型等信息,并根据这些信息判断打开的图像文件的类型。如果是分类图像,则还需获取每个类别的颜色信息。最后根据数据类型读取图像数据,显示图像。
原文地址: https://www.cveoy.top/t/topic/oakS 著作权归作者所有。请勿转载和采集!