分享一个IDL写GIF的方法

之前做图的时候,经常要做动态的GIF图,通常情况下我会借助第三方软件(例如:Photoshop)等等来做。今天一个偶然的发现,在IDL中可以直接写入GIF图片,并且测试了一下,效果很是不错,这里共享下代码。

全部代码

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


方便起见,这里直接将这个方法封装成了一个过程,关于过程和函数的区别以及使用方法,你可以参考这篇文章:IDL中的函数和过程

in_filenamelist:代表整个GIF数组,每张图片就是其中的一维
outfname:输出文件的完整路径+文件名,例如:D:\a.gif
delay_time:每张图片播放的间隔时间
IDL中的函数和过程 IDL保存图像(对象图形法)

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

发表评论