IDL遥感应用入门(16):使用IDL生成动画(GIF图)
发布时间: 2014-01-17
所属分类: IDL遥感应用教程
在之前的文章中,我介绍了一种使用IDL自带的XINTERANIMATE函数生成动画的方法,但是这种方法有一种致命的缺点,没有colorbar和经纬度,这对于一幅遥感图像来说是不完整的。
针对上面的问题,我做了如下的思考。
- 动画可以用GIF图片展示,参照:分享一个IDL写GIF的方法
- 所有对象图形法绘制的图像可以存为文件,参照:IDL保存图像(对象图形法)
基于上面的两点思考,我结合分享一个IDL写GIF的方法一文中所给的过程,重新写了教程15的代码
全部代码
;Author:Sailor
;2014-01-17
PRO Course_14
;定义文件路径
MyRootDir='D:\10\'
;遍历文件夹
filearr = file_search(MyRootDir,'*.nc',count=num)
sstdisplay=intarr(4096,2048,num)
FOR fileindex=0,num-1,1 DO BEGIN
nid = ncdf_open(filearr[fileindex], /nowrite )
; inquire about this file; returns structure
file_info = ncdf_inquire(nid)
; print out the dimensions of this file
FOR dimid=0, file_info.ndims -1 DO BEGIN
ncdf_diminq, nid, dimid, name, size
print, ' ---> dimension ' + name + ' is: ', size
ENDFOR
FOR varid=0, file_info.nvars-1 DO BEGIN
; inquire about the variable; returns structure
var = ncdf_varinq( nid, varid )
print,var
print,'========================'
;read all attributes
FOR var_att_id=0,var.natts -1 DO BEGIN
att_name = ncdf_attname( nid, varid, var_att_id )
print,att_name
ncdf_attget, nid, varid, att_name, tematt
print,string(tematt)
ENDFOR
ENDFOR
;read sst
sstid = ncdf_varid(nid, 'analysed_sst')
ncdf_varget, nid, sstid, sst
sst=sst*0.01+273.150
print,size(sst)
landindex=where(sst eq min(sst))
sst[landindex]=max(sst)+1
print,max(sst),min(sst)
sst=shift(sst,2048)
Img=image(sst,rgb_table=39,title=filearr(fileindex),grid_units=1,POSITION=[0.1,0.2,0.9,0.9])
xaxis=axis(TARGET=Img,'X',LOCATION=[0,0],AXIS_RANGE=[-180,180],MINOR=0, MAJOR=19,COORD_TRANSFORM=[-180,360.0/4096.0],title='Longitude(°)')
yaxis=axis(TARGET=Img,'Y',LOCATION=[0,0],AXIS_RANGE=[-90,90],MINOR=0, MAJOR=7,COORD_TRANSFORM=[-90,180.0/2048.0],title='Latitude(°)')
c1 = COLORBAR(rgb_table=39,RANGE=[-2+273.15,34+273.15],ORIENTATION=0,TITLE='(K) ',POSITION=[0.1,0.1,0.9,0.15])
Img.save,MyRootDir+strtrim(string(fileindex),2)+'a.jpg'
ENDFOR
;读取所有的图像
gifarr = file_search(MyRootDir,'*a.jpg',count=num)
in_filenamelist=gifarr
outfname=MyRootDir+'a.gif'
delay_time=20
create_gif_animation,gifarr,outfname,delay_time
spawn,outfname
END
PRO create_gif_animation,in_filenamelist, outfname, delay_time
COMPILE_OPT IDL2
;Get the number of input files.
file_nums = N_ELEMENTS(in_filenamelist)
IF (file_nums GT 0) AND ~STRCMP(in_filenamelist[0], '') THEN BEGIN
FOR i = 0, file_nums - 1 DO BEGIN
img = READ_IMAGE(in_filenamelist[i], red, green, blue)
;Get the size information.
img_s = SIZE(img)
;If the dimension of the img is 3-D, then convert it to a index image first.
IF (img_s[0] EQ 3) THEN BEGIN
img_idx = COLOR_QUAN(img[0, *, *], img[1, *, *], img[2, *, *], tbl_r, tbl_g, tbl_b)
;Reverse array in the second dimension.
img_idx = REFORM(img_idx)
WRITE_GIF, outfname, img_idx, tbl_r, tbl_g, tbl_b, $
DELAY_TIME = delay_time, /MULTIPLE, REPEAT_COUNT = 0
ENDIF
;If the dimension of the img is 2-D, then write it to the gif file directly.
IF (img_s[0] EQ 2) THEN BEGIN
img =REFORM(img)
IF (N_ELEMENTS(red) GT 0) AND (N_ELEMENTS(green) GT 0) AND (N_ELEMENTS(blue) GT 0) THEN BEGIN
WRITE_GIF, outfname, img, red, green, blue, DELAY_TIME = delay_time, /MULTIPLE, REPEAT_COUNT = 0
ENDIF
ENDIF
ENDFOR
;Close the file.
WRITE_GIF, outfname, /CLOSE
ENDIF
END
效果图
一些说明
如有问题,欢迎留言。
相关阅读
声明
1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。
2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。
手机阅读
公众号关注
知识星球
手机阅读
最新GIS干货
私享圈子
感谢你的代码分享,我把代码拷贝后运行,出现错误如下:
Variable is undefined: IN_FILENAMELIST.
Execution halted at: CREATE_GIF_ANIMATION 88 C:\Users\Administrator\IDLWorkspace82\Default\create_gif_animation.pro
意思是IN_FILENAMELIST这个变量未定义,我不知道哪里出错了,希望指导,非常感谢!
我更新了代码,你再尝试一下?
我又运行了一遍,还是相同的问题,我的版本是IDL8.2,莫非是版本问题?你运行完全正常吗?
你的D:\10\这个目录下面有jpg文件么?
运行代码后,没有jpg文件
而且每次运行问题都是下面指向这句代码:
IF (file_nums GT 0) AND ~STRCMP(in_filenamelist[0], '') THEN BEGIN
这代码的意思是将jpg合成gif啊,没有jpg文件IN_FILENAMELIST当然就没定义。
前半部分代码的意思是生成jpg文件,后半代码是合成gif,你意思是必须提前在10这个目录下就有jpg吗?我单独运行前半部分的代码,可以生成jpg,但是整个代码一起运行就有错误,不知道为什么?
你全部运行的时候,设置一个断点,看一下IN_FILENAMELIST这个变量有没有值?这个后面定义的create_gif_animation是一个IDL过程。
您好,我遇到了和您相同的问题,请问您是如何解决的呀
今天终于运行成功了,生成了GIF图,非常感谢你耐心的解答!还有一个问题,这个图中颜色深浅代表什么物理量的大小呢,还有下面刻度单位K代表什么?
没记错的话是开氏温度。
我想把几幅TIFF格式的数据转换成GIF,这个代码可以吗
在吗
格式转换用PS就行。。
我想做成动态的呢
也是随着日期变化的几幅图
使用这个方法就可以了。
你这个GIF图竟然有时间信息,是这个代码运行完就加上的还是后期处理的呢
源数据里面就有。
请问in_filenamelist=gifarr 为什么要这样呢 不是直接使用gifarr 它不是代表路径吗 这样in_filenamelist就不是路径了吗
应该也可以,你试试。
为什么要分二维和三维的呢
请问WRITE_GIF: Image size incompatible这是为什么呢