在做程序开发时,最基本需要做的是如何编程实现文件的打开和保存,这里我们来介绍一下如何采用envi+idl的方式打开和保存一个文件
首先我们来看这么一个程序
;该程序是利用envi的二次开发功能来对数据进行处理
;主要功能是利用envi打开文件,并将文件保存为另外一种格式
;这个程序对于envi处理后的文件只能envi打开,其他文件打不开的情况下非常有用
;这个程序包含了两个小程序,一个是处理单个文件,另外一个便是批处理的方式
pro envi_savefile
; filename =envi_pickfile()
;envi_pickflie()打开一个文件,返回选择的文件名
cd,'d:\test'
filenames=file_search('*.tif',count=n)
print,n,filenames
len=strlen(filenames[0])
;len计算文件名的长度
for i=0,n-1 do begin
filename=filenames[i]
envi_open_file,filename,r_fid =fid
;envi_open_file,返回文件的fid
;envi_select可以交互的选择文件,并返回fid
envi_file_query,fid,data_type=data_type, xstart=xstart, $
ystart=ystart, interleave=interleave, nb=nb, nl=nl, ns=ns,$
offset=offset,dims=dims
;envi_file_query查询文件的头文件信息
map_info=envi_get_map_info(fid=fid)
proinfo=envi_get_projection(fid=fid)
;envi_get_map_info and envi_get_projection返回图像的投影坐标信息
data =envi_get_data(fid=fid,dims=dims,pos=[0])
;envi_get_data是获取一个波段数据,dims是数据的范围,pos是波段;用envi_get_data的方式,一次只能打开一个波段
;envi_get_slice,可以获取一个数据中某一行的所有波段数据
;envi_enter_data,将文件输出到envi文件列表中
; image =strmid(filename,0,len-8)+'.tif';'tif'
;同样也可以用下面这一行程序
image=envi_pickfile()
;在打开对话框中输入文件名即可,记着加后缀
; 但是利用打开对话框的方式写入img格式的话,其他软件不能识别
; openw,lun,image,/get_lun
;
; writeu,lun,data
;
; free_lun,lun
;如果是保存为img格式,必须用writeu的方式写入,但是如果是tif,则用下面的命令
write_tiff,image,data,/float
envi_setup_head, fname=image, ns=ns, nl=nl, nb=nb, $
data_type=data_type, offset=offset, interleave=interleave, $
xstart=xstart, ystart=ystart, $
descrip='iimage', /write, /open, $
map_info=map_info ,file_type=33
;将头文件信息写入新的文件
endfor
end
如果采用envi_setup_head,来进行文件信息写入,要写上file_type对应的关键字,
否则的话,会导致保存的图像有个偏移,
此外ENVI_Write_ENVI_File也可以保存文件,如
ENVI_Write_ENVI_File,data,out_name=image,map_info=map_info,r_fid=fid
但是保存的文件不能被其他软件读
用ENVI_OUTPUT_TO_EXTERNAL_FORMAT也可以输出你想要的格式,并且相对于write来写更容易被其他软件接受
;其实用write_tiff写出的文件,在erdas中不认其坐标除非是采用了geotiff=geographictypegeokey
如果是二进制文件,可以采用writeu保存,然后写入头文件