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,用户输入参数后,根据输入的参数信息生成头文件,并写入文件。如果存在,则直接打开图像文件。

接着读取头文件信息,获取图像的波段数、样本数、行数、数据类型、文件类型、类别数、传感器类型等信息,并根据这些信息判断打开的图像文件的类型。如果是分类图像,则还需获取每个类别的颜色信息。最后根据数据类型读取图像数据,显示图像。
C++: 打开图像文件并读取头文件信息

原文地址: https://www.cveoy.top/t/topic/oakS 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录