|
利用其他语言如C/C++等直接读取ENVI的数据,则可以先对hdr文件进行解析,获取数据类型。
hdr的文件结构如下,
ENVI description = { Canon City, Colorado, Landsat TM, Calibrated to Reflectance } samples = 640 lines = 400 bands = 6 header offset = 0 file type = ENVI Standard data type = 1 interleave = bsq sensor type = Landsat TM wavelength units = Micrometers z plot range = {0.00, 100.00} z plot titles = {Wavelength, Reflectance} band names = { TM Band 1, TM Band 2, TM Band 3, TM Band 4, TM Band 5, TM Band 7} wavelength = { 0.48500, 0.56000, 0.66000, 0.83000, 1.65000, 2.21500} |
解析的关键信息有samples:640(列),lines:400(行),header offset:0(头信息偏移量-单位为字节),data type=1(数据类型代码,见下表)。
数据类型 |
代码 |
字节型 |
1 |
16位有符号整型 |
2 |
32位有符号长整型 |
3 |
32位无符号长整型 |
13 |
浮点型 |
4 |
双精度浮点型 |
5 |
对常用数据类型文件进行了读写的测试,值完全一致。
利用IDL进行文件写出:
;+ ;C++读取ENVI格式技术测试代码 ; :输出不同数据类型的二进制文件 ; ; Author: DYQ 2011年6月2日 ; ; BBS: http://bbs.esrichina-bj.cn/ESRI/forum-28-1.html ; E-Mail: dongyq@esrichina-bj.cn ; Blog: http://hi.baidu.com/dyqwrp ;- PRO test_out_bin outdir = 'c:temp' if file_test(outdir,/directory) ne 1 then file_mkdir,outdir ;字节byte OPENW,lun,outdir+'a.dat',/get_lun WRITEU,lun,BINDGEN(10) FREE_LUN,lun ;整型int OPENW,lun,outdir+'b.dat',/get_lun WRITEU,lun,INDGEN(10) FREE_LUN,lun ;浮点float OPENW,lun,outdir+'c.dat',/get_lun WRITEU,lun,FINDGEN(10) FREE_LUN,lun ;长整型long OPENW,lun,outdir+'d.dat',/get_lun WRITEU,lun,LINDGEN(10) FREE_LUN,lun ;双精度double OPENW,lun,outdir+'e.dat',/get_lun WRITEU,lun,DINDGEN(10) FREE_LUN,lun END |
C++下读取文件:
//;C++读取ENVI格式技术测试代码 #include "stdafx.h" #include "iostream.h"
int main(int argc, char* argv[]) { printf("Hello ! Successful Using C++! ^_^ n");
int i,n; FILE*fp;
//二进制字节型 char *bdata=new char[10]; fp=fopen("c:\temp\a.dat","rb"); n=fread(bdata,1,10,fp); fclose(fp); for(i=0;i<10;i++) { cout<<"二进制"; cout<<i<<":"<<short(bdata[i])<<endl; } //二进制整型文件 short int *idata=new short int[10]; fp=fopen("c:\temp\b.dat","rb"); n=fread(idata,2,10,fp); fclose(fp); for(i=0;i<10;i++) { cout<<"整型"; cout<<i<<":"<<idata[i]<<endl; } //二进制浮点文件 float *fdata=new float[10]; fp=fopen("c:\temp\c.dat","rb"); n=fread(fdata,4,10,fp); fclose(fp); for(i=0;i<10;i++) { cout<<"浮点"; cout<<i<<":"<<fdata[i]<<endl; } //二进制长整型文件 long *ldata=new long[10]; fp=fopen("c:\temp\d.dat","rb"); n=fread(ldata,4,10,fp); fclose(fp); for(i=0;i<10;i++) { cout<<"长整型"; cout<<i<<":"<<ldata[i]<<endl; } //双精度double double *ddata=new double[10]; fp=fopen("c:\temp\e.dat","rb"); n=fread(ddata,8,10,fp); fclose(fp); for(i=0;i<10;i++) { cout<<"双精度型"; cout<<i<<":"<<ddata[i]<<endl; }
return 0; } |
最后输出:
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-2 09:22
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社