Version 18 of AniGif

Updated 2011-12-10 08:24:12 by RLE

AniGif - animated GIF-Images

 Where: http://cardtable.go.to/tcltk/
 Mirrored here: http://cardtable.sourceforge.net/tcltk/
 Description: Tk extension allowing you to create, start, stop, restart
        and destroy animated GIFs.  Supports single play images as well as
        images without full image data on each frame.
        Use gifsicle to uncompress compressed/interlaced GIFs before
        subsequent processing.
        Currently at version 1.3 .
 Updated: 03/2002
 Contact: mailto:[email protected]

Is "animated gif" somehow a Windows-specific notion? Modern Mac OS X opens animated gif-s with Preview, and Preview does not appear to animate. Lars H: I don't think it's Windows-specific, but I recall seeing the animation feature descibed as a bit of an oddity. Try opening in a web browser instead; I see the test animation on this page fine in Safari. It's possible that Preview lets you view each frame of the gif as a still image instead.

The Tk code which follows, of course, executes and displays quite nicely on all platforms.


RS 2004-07-27: Also, in plain Tk (but documented only for Img), you have access to the partial images of an animated GIF. This code was enough for me:

 package require Img

 proc anigif file {
    #-- returns a list of images from the given GIF file
    set index 0
    set results {}
    while 1 {
        if [catch {
            image create photo -file $file -format "gif -index $index"
        } res] {
            return $results
        }
        lappend results $res
        incr index
    }    
 }

#-- Testing (dumping the animation phases, one next to the other, into a text widget):

[WikiDbImage anigif.jpg] Test image: [WikiDbImage underconstruction.gif]

#-- Testing (dumping the animation phases into a text widget, and an animation):
 proc lcycle listName {
    upvar 1 $listName list
    set res [lindex $list 0]
    set list [concat [lrange $list 1 end] [list $res]]
    set res
 }
 proc every {ms body} {eval $body; after $ms [info level 0]}
 set file [lindex $argv 0]

 pack [text .t]
 set images [anigif $file]
 foreach img $images {
    .t image create end -image $img
 }
 .t insert end animated:
 set id [.t image create end -image [lindex $images 0]]
 every 100 ".t image config $id -image \[lcycle ::images\]"

Here's a slightly more minimal-but-generalizable form, applied to a canvas:

  proc animate_in_canvas {canvas gif} {
    global id_list

        # As written, there's only room for a single animation at a time.
    set id_list {}
    foreach img [anigif $gif] {
       lappend id_list [.c create image 0 0 -anchor nw -image $img]
    }
    every 150 ".c raise \[lcycle ::id_list\]"
  }

  pack [canvas .c -height 300 -width 300]
  animate_in_canvas .c [lindex $argv 0]

mzgcoco

  #apply to a label
  proc play {ms lbl img_list} {
    set img [lindex [$lbl config -image] end]
    set idx [lsearch $img_list $img]
    incr idx
    if {$idx > [llength $img_list] - 1} {
       set idx 0
    }
    $lbl config -image [lindex $img_list $idx]
    after $ms "play $ms $lbl \"$img_list\""
  }

  set img_list [anigif d:/dummy/ss.gif]
  label .l -image [lindex $img_list 0]
  pack .l 

  play 100 .l "$img_list"

rahulj what about destroying animated gif canvas or label?