IDL遥感应用入门(16):使用IDL生成动画(GIF图)

在之前的文章中,我介绍了一种使用IDL自带的XINTERANIMATE函数生成动画的方法,但是这种方法有一种致命的缺点,没有colorbar和经纬度,这对于一幅遥感图像来说是不完整的。

针对上面的问题,我做了如下的思考。

  1. 动画可以用GIF图片展示,参照:分享一个IDL写GIF的方法
  2. 所有对象图形法绘制的图像可以存为文件,参照: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

效果图

一些说明

本文所用的数据依然是教程15的数据,你可以从这里下载

如有问题,欢迎留言。

IDL保存图像(对象图形法) IDL DIALOG_PICKFILE 调用系统打开文件对话框

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

已有 22 条评论

  1. luffylaw2
    1#
    luffylaw2  · 2016-04-07 12:18

    感谢你的代码分享,我把代码拷贝后运行,出现错误如下:
    Variable is undefined: IN_FILENAMELIST.
    Execution halted at: CREATE_GIF_ANIMATION 88 C:\Users\Administrator\IDLWorkspace82\Default\create_gif_animation.pro
    意思是IN_FILENAMELIST这个变量未定义,我不知道哪里出错了,希望指导,非常感谢!

      1. Sailor
        Sailor  · 2016-04-07 23:41

        我更新了代码,你再尝试一下?

          1. luffylaw2
            luffylaw2  · 2016-04-08 10:16

            我又运行了一遍,还是相同的问题,我的版本是IDL8.2,莫非是版本问题?你运行完全正常吗?

              1. Sailor
                Sailor  · 2016-04-09 00:01

                你的D:\10\这个目录下面有jpg文件么?

                  1. luffylaw2
                    luffylaw2  · 2016-04-09 10:30

                    运行代码后,没有jpg文件

              2. luffylaw2
                luffylaw2  · 2016-04-09 10:39

                而且每次运行问题都是下面指向这句代码:
                IF (file_nums GT 0) AND ~STRCMP(in_filenamelist[0], '') THEN BEGIN

                  1. Sailor
                    Sailor  · 2016-04-10 20:08

                    这代码的意思是将jpg合成gif啊,没有jpg文件IN_FILENAMELIST当然就没定义。

                  2. luffylaw2
                    luffylaw2  · 2016-04-10 20:25

                    前半部分代码的意思是生成jpg文件,后半代码是合成gif,你意思是必须提前在10这个目录下就有jpg吗?我单独运行前半部分的代码,可以生成jpg,但是整个代码一起运行就有错误,不知道为什么?

                  3. Sailor
                    Sailor  · 2016-04-11 00:39

                    你全部运行的时候,设置一个断点,看一下IN_FILENAMELIST这个变量有没有值?这个后面定义的create_gif_animation是一个IDL过程。

          2. luffylaw2
            luffylaw2  · 2016-04-12 10:46

            今天终于运行成功了,生成了GIF图,非常感谢你耐心的解答!还有一个问题,这个图中颜色深浅代表什么物理量的大小呢,还有下面刻度单位K代表什么?

              1. Sailor
                Sailor  · 2016-04-12 23:03

                没记错的话是开氏温度。

                  1. 奥布莱恩
                    奥布莱恩  · 2016-08-31 09:34

                    我想把几幅TIFF格式的数据转换成GIF,这个代码可以吗

                  2. 奥布莱恩
                    奥布莱恩  · 2016-08-31 09:49

                    在吗

                  3. Sailor
                    Sailor  · 2016-08-31 10:18

                    格式转换用PS就行。。

                  4. 奥布莱恩
                    奥布莱恩  · 2016-08-31 10:28

                    我想做成动态的呢

  2. 奥布莱恩
    2#
    奥布莱恩  · 2016-08-31 10:30

    也是随着日期变化的几幅图

      1. Sailor
        Sailor  · 2016-08-31 16:52

        使用这个方法就可以了。

  3. 奥布莱恩
    3#
    奥布莱恩  · 2016-09-20 16:31

    你这个GIF图竟然有时间信息,是这个代码运行完就加上的还是后期处理的呢

      1. Sailor
        Sailor  · 2016-09-20 20:39

        源数据里面就有。

  4. hikari
    4#
    hikari  · 2016-11-22 18:39

    请问in_filenamelist=gifarr 为什么要这样呢 不是直接使用gifarr 它不是代表路径吗 这样in_filenamelist就不是路径了吗

      1. Sailor
        Sailor  · 2016-11-23 08:55

        应该也可以,你试试。

          1. hikari
            hikari  · 2016-11-23 11:41

            为什么要分二维和三维的呢

发表评论