前言
明天晚上坐火车回学校了,电脑可能就收起来了,只好白天写了,争取写博客的时候教学性更强一点让人更加容易看懂,毕竟这几篇文章可能对复习IDL考试有一些帮助,主要是有客户群体,开玩笑,哈哈!不过程序是应用导向的,写程序还是应该明白自己要干什么再写,要不然写起来很费时费劲,更别说考试的时候写了,背?头给你拧下来你也背不出来。
需求分析
所以开始按照需求部分来按块写代码,里面的内容尽量也写详细一些。
1.分配内存,读入二进制文件,并进行预处理
file = 'C:\Users\黄\Desktop\classimage.dat'
data = make_array(5963, 5988,type = 1)
openr,lun,file,/get_lun
readu,lun,data
free_lun,lun
data = congrid(data,596,599)
第一行是文件名没啥毛病,然后make_array创建一个大小为5963列,5988行的矩阵,注意IDL和另外语言的索引不一样,它先列再按行索引,所以有点奇葩。type为1是一种字节类型的数据
openr,lun,file,/get_lun,lun
后面进行读文件操作,首先把文件读出来,再将值赋值给所需要的变量。
读取文件的过程openr,lun,filename,/get_lun,openr为只读模式不进行操作。
读取数据,lun可以理解成一种驱动号,或者读取文件的标识,也可以理解成为一个指针,/get_lun是自动获取lun;lun自动从100开始
readu,lun,data
根据驱动号去读数据,由于是dat文件,普通记事本打开显示的时候照理应该是乱码,不过没啥影响,这些语言基本都有现成的方法可以读出来,二进制用readu读,然后lun是驱动号,将读出来的数据赋值给data这个变量,那么data就有数据了,就完成了读入数据的操作。
free_lun,lun
完成后记得释放这个指针,要不然占内存,浪费空间。
data = congrid(data,596,599)
congrid函数将数组的大小缩小或扩展任意数量。CONGRID与REBIN类似,它可以调整一维、二维或三维数组的大小,
但是如果REBIN要求新数组大小必须是原始大小的整数倍,CONGRID会将数组大小调整为任意大小。
(REBIN稍微快一些)当收缩一个数组时,REBIN平均多个点,而CONGRID只对数组重新采样。]
相当于将图缩小到原来的1/10,以便后面的tv显示。
2.创建窗体和索引矩阵和标签条,并且按照颜色显示
window,1,xsize = 800,ysize = 700
DEVICE, decomposed = 0
lookup = [255, 255, 255, 90, 178, 115, 233, 255, 190, 240, 240, 240, 151, 219, 242, 214, 133, 137]
lookup = reform(lookup,3,6)
tvlct,lookup[0,*], lookup[1,*], lookup[2,*]
ERASE, 0
TV, data, 70,70,order = 1
colbar = rebin(INDGEN(1, 6), 40, 240)
TV, colbar, 650, 50
LOADCT,0
shadowdata = BYTARR(3,240)+180
TV, shadowdata, 690, 50
bottomshad = BYTARR(40,3)+180
TV, bottomshad, 653,47
classnames = ['background', 'forest', 'agriculture', 'city', 'water', 'other']
xpos = 705+intarr(6)
ypos = 60+indgen(6)*40
xyouts,xpos,ypos,classnames, color=0,/device
window,1,xsize = 800,ysize = 700
创建一个窗体,代号为1,窗体的横方向大小为800,纵方向为700。
DEVICE, decomposed = 0
设备过程提供对当前图形设备的设备相关的控制(由set_PLOT例程设置)。IDL图形程序和功能与设备无关。
也就是说,IDL为用户提供了一个与所有设备一致的接口。但是,大多数设备都有一些额外的功能,
这些功能不能通过这个接口直接使用。设备用于访问和控制这些能力。它通过指定不同设备的不同关键字来使用。
设置此关键字可控制在使用分解颜色的显示器(TrueColor或DirectColor视觉效果)时如何解释颜色值。
此关键字对索引颜色设备没有影响,索引颜色设备通常使用每像素8位指定颜色。
这些是IDL帮助的翻译,其实理解下就是提供一种索引机制了
lookup = [255, 255, 255, 90, 178, 115, 233, 255, 190, 240, 240, 240, 151, 219, 242, 214, 133, 137]
lookup = reform(lookup,3,6)
tvlct,lookup[0, *], lookup[1,*], lookup[2,*]
先创建一个矩阵,即按照RGB来显示,每3个列成一种颜色,一开始是个18个元素的行矩阵,reform将它重新改变大小为 3列6行的矩阵,然后tvlct,lookup[0,*]即按照每一列来显示,*代表全访问,即RGB分别为一、二、三列。
ERASE, 0
TV, data, 70,70,order = 1
由于创建后的界面是黑色的,通过erase,0将背景改成白色的,然后就是显示图像了,order必须加上否则图像会被倒过来。完成后应该是酱的。
截图没截好,尴尬,这时候已经完成了按照索引矩阵显示颜色的操作,后面继续进行标签的制作,
colbar = rebin(INDGEN(1, 6), 40, 240)
TV, colbar, 650, 50
创建colorbar,其实所谓的标签就只是一个矩阵而已,先创建一个0-5的矩阵,然后重采样为40列240行的矩阵,其实可以理解成宽和高,然后tv,colorbar就是显示了,由于之前已经设置了显示颜色的模式,即之前的tvlct,所以自动按照合适的颜色显示了。
这里开始是创建标签条和阴影了!
LOADCT,0
shadowdata = BYTARR(3,240)+180
TV, shadowdata, 690, 50
bottomshad = BYTARR(40,3)+180
TV, bottomshad, 653,47
这里必须重新加载显示颜色的方式,locadct,0
loadct过程加载一个预定义的IDL颜色表。除非指定了file关键字,否则这些颜色表在colors1.tbl文件中定义,
该文件位于主IDL目录的\resource\colors子目录中。
选定的颜色表将作为“当前”和“原始”颜色表加载到颜色公用块中。如果当前设备的颜色少于256种,颜色表数据将被插值以覆盖设备中的颜色数。
上面一段是IDL的帮助文档。
然后是老师自己加的阴影部分,创建一个数据类型为字节的矩阵即shadowdata,3列240行,其实就是右边的阴影即bottomshad,下面创建一个40列,3行的矩阵,就是下面阴影,
然后tv就是让他们显示在应该有的位置
classnames = [‘background’, ‘forest’, ‘agriculture’, ‘city’, ‘water’, ‘other’]
xpos = 705+intarr(6)
ypos = 60+indgen(6)*40
XYOUTS,xpos,ypos,classnames, color=0,/device
这里就是定义标签的名称,然后控制他们的位置,x方向是应该是一样的,intarr(6)是6个0,加上705就是6个705,然后y方向生成一个等差数列,从0开始到200,然后再加60,控制y方向的高度,可以显示在合适的位置。最后利用xyouts,x,y,var,color=0,/device来显示字体。整个程序就完成了。