TIP 632: return gif animated metadata

Author:		Harald Oehlmann <[email protected]>
State:		Final
Type:		Project
Vote:		Done
Created:	12-Aug-2022
Tcl-Version:	8.7
Vote:	Done
Vote-Summary:   Accepted 6/0/0
Votes-For:      MC, BG, SL, JN, FV, KW 
Votes-Against:  none
Votes-Present:  none
Tk-Ticket:	f285ddcd23
Tk-Branch:	rfe-f285ddcd-animated-gif-metadata
Keywords:	tk image


Return the animation parameters of an animated GIF within the image metadata.


Tk provides the possibility to get one image of an animated image sequence as follows:

$image configure -format "gif -index $index"

Nevertheless, the parameters for animated gif display are not returned. This TIP proposes to return those parameters to be able to display the animated gif with the help of TCL code.

Please refer to this stack overflow question and answer: https://stackoverflow.com/questions/72486189/tcl-tk-animated-gif-not-decoded-correctly


If the gif file indexed image is loaded to a tcl image, the following metadata keys are set if the relevant data is present:

The key and value names are taken from the GIF89a standard document.


The example solution given in the stack overflow ticket by Schelte Bron may be modified as follows:

proc nextFrame {image {index 0}} {
    if {[catch {tmpimg configure -format "gif -index $index"} stderr]} {
        set nextIndex 0
        set time 1
    } else {
        set nextIndex [expr {$index + 1}]
        set metadata [tmpimg cget -metadata]
        if {    [dict exists $metadata "disposal method"]
                && [dict get $metadata "disposal method"] eq "do not dispose"
        } {
            $image copy tmpimg -compositingrule overlay
        } else {
            $image copy tmpimg -compositingrule set
        if {[dict exists $metadata "delay time"]} {
            set time [expr {[dict get $metadata "delay time"]*10}]
        } else {
            set time 1
    after $time nextFrame $image $nextIndex

set img [image create photo -file [file join $dir animated.gif]]
# Create a helper image
image create photo tmpimg -file [$img cget -file]

label .w -image $img
pack .w

nextFrame $img

Now, the values for delay time and disposal mehtod (partly) are used instead of heuristic values.


The implementation is available in the given Tk branch.


Discussion took place at the RFE Tk ticket: https://core.tcl-lang.org/tk/tktview?name=f285ddcd23.


This document has been placed in the public domain.