ENVI
description = {
samples = 1996
lines = 1125
bands = 4
header offset = 0
file type = ENVI Standard
data type = 12
interleave = bip
上面这些是要读取的二进制文件的基本信息
下面附上我读取和显示的代码:
#include<stdio.h>
int r1,g1,b1;//用来改变显示遥感图像的波段
AnsiString storefile;//用来存放文件路径
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int count1=0;//用来计算绘图位置
int offset=15952;//1996列*8字节-读取的16字节
int r,g,b;//用来储存RGB
FILE *fp;//定义文件指针
unsigned short int idata[8];//用来读取本行数据
unsigned short int nextidata[8];//用来读取下行数据
AnsiString name;
name=storefile;
fp=fopen(name.c_str(),"rb");//打开文件
if(fp!=NULL)
{
while(!feof(fp))//循环一直到文件读取完毕
{
fread(idata,2,8,fp);//读取本行数据储存在idata[]中
fseek(fp,offset,1); //调整指针到下一行
fread(idatanext,2,8,fp);// 读取调整指针后的这一行数据
if(count1%998!=0) //如果这一行数据读到头,要调到隔一行的那一行
fseek(fp,-(offset+16),1);//将指针调回上一行并退回到上一次读取的位置
count1++;
r=(idata[r1]+idata[r1+4]+idatanext[r1]+idatanext[r1+4])/12.8;
g=(idata[g1]+idata[g1+4]+idatanext[g1]+idatanext[g1+4])/12.8;
b=(idata[b1]+idata[b1+4]+idatanext[b1]+idatanext[b1+4])/12.8;
//将读取出本行和下一行的共16个数据每相邻的四个一组求平均值作为RGB输出到image,以实现图像缩小或者说压缩
Image1->Canvas->Pixels[count1%998-1][count1/998]
=Graphics::TColor(RGB(r,g,b));//将图像输出到image
}
fclose(fp);//关闭文件
}
}
----------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(OpenDialog1->Execute())
storefile=OpenDialog1->FileName;
//使用Dialog组件打开文件,将文件地址赋给storefile
}
----------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
switch(ComboBox1->ItemIndex)
{
case 0: r1=0 ;break;
case 1: r1=1 ;break;
case 2: r1=2 ;break;
case 3: r1=3 ;break;
}
}
//使用ComboBox组件来实现选择波段R
----------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
switch(ComboBox2->ItemIndex)
{
case 0: g1=0 ;break;
case 1: g1=1 ;break;
case 2: g1=2 ;break;
case 3: g1=3 ;break;
}
}
//使用ComboBox组件来实现选择波段G
----------
void __fastcall TForm1::ComboBox3Change(TObject *Sender)
{
switch(ComboBox3->ItemIndex)
{
case 0: b1=0 ;break;
case 1: b1=1 ;break;
case 2: b1=2 ;break;
case 3: b1=3 ;break;
}
}
//使用ComboBox组件来实现选择波段B
注:本程序用了image,button,ComboBox组件,
ENVI文件:http://pan.baidu.com/s/1cohuQq