headerIcone

Patinaud.org


Le système d'information dans toute sa définition

Documentaires
Technologies
Législation
Normes et bonnes pratiques
 
Architecture applicative
 
 
Composants réseau
 
 
Encodage binaire
 
 
Protocoles réseau
 
A propos de Patinaud.org

Écriture binaire des images GIF

Le format GIF présente de nombreux avantages dont notamment la possibilité de créer des images animées. Il dispose d'un moteur de compression sans perte relativement efficace. Cependant ce format n'autorise que le dessin de 255 couleurs différentes pour la même image.

Représentation des données

Le code binaire des images GIF se décomposent selon cinq parties : - La signature du fichier : la signature écrite du fichier permet d'indiquer qu'il s'agit d'une image de type GIF. Celle-ci est composée des trois lettres GIF suivi du numéro de version du format sur trois octets. - La description de l'écran : permet notamment de définir la taille de l'image ainsi que l'utilisation ou non d'une palette de couleur commune à tout le fichier. - La palette de couleur commune : celle-ci permet de définir de manière générique la liste des couleurs pouvant être utilisées sur l'ensemble de l'image. Des palettes de couleur spécifiques peuvent également être définies pour dessiner certaines partie de l'image. - Initialisation des extensions : Cette partie optionelle permet d'indiquer si des extensions existent dans l'image et quelle application est utilisée pour les interprétées. Il s'agit généralement de NETSCAPE. - Le corps de l'image : représente les images du fichier, un fichier peut en effet contenir plusieurs images dans le cadre d'un gif animé. Il comporte également de manièrre optionnel une extension permettant notamment de créer des images animées. Ces cinq parties sont détaillées dans le tableau ci-dessous :
Adresse du groupeTaille du groupeNom de l'attributValeurInformations supplémentaires
1/ Signature du fichier
0x01 à 0x066 octetsSignatureGIF(suivit de la version) soit : 0x47 49 46 X X XLes trois premiers octets de la signature (GIF) sont invariants et les trois suivants peuvent évoluer selon la version du format GIF utilisé.
2/ Description de l'écran
0x01 et 0x022 octetsLargeur de l'image en pixelCodé en LSB first (Low Significant Bit first) soir l'octet ayant le poids le plus faible vient en premier. Une largeur de 10 pixels s'écrira donc : 0x0A 00
0x03 et 0x042 octetsHauteur de l'imageCodé en LSB first comme pour la largeur
0x051 octetParamétrage de la palette comune0xF(0 à 8)Cet octet permet de configurer la palette de couleur comune à toute les images du fichier. Les bits sont indiqués du poids le plus fort vers le bit ayant le poids le plus faible (autrement dit de la gauche vers la droite) : - 1er bit : Indicateur de palette de couleur commune à toute l'image. Si le bit est valorisé à 1 alors une palette de couleur commune est définie (préconisé si l'image comporte un certain nombre de couleurs identiques). Se le bit est valorisé à 0 alors la palette commune n'est pas définie. - 2ᵉ, 3ᵉ et 4ᵉ bit : nombre de bit de la résolution de couleur. Par principe il est préférable d'utiliser un octet par couleur (RGB). Ces trois bits devront donc être valorisés à 1. - 5ᵉ bit : réservé - 6ᵉ, 7ᵉ et 8ᵉ bit : nombre de bit plus 1 nécessaire à l'adresse d'une couleur définie dans la palette de couleur générale commune. Si ces bit sont valorisés à 4 (100 en décimal) cela signifie que 5 bits seront nécessaires pour trouver l'adresse d'une couleur dans la palette. 5 bits donnant la possibilité de coder 64 adresses par conséquents 64 couleurs seront définis dans la palette.
0x061 octetAdresse de la couleur de fondLa couleur est définie en fonction de la palette commune ou de la palette par défaut si celle-ci n'est pas définie
3/ Palette de couleur commune (optionnelle)
0x01 à 0x033 octetsValeur de la couleur définie à l'indexe 0Les couleurs sont écrites dans l'ordre suivant : Rouge sur un octet, Vert sur un octet et Bleu sur un octet. Ainsi la couleur s'écrira 0x 00 00 FF
0x04 à 0x063 octetsValeur de la couleur définie à l'indexe 1Les couleurs sont écrites dans l'ordre RGB
0x07 jusqu'à la définition de la dernière couleur de la palette3 octetsValeur de chaque couleur de la paletteToutes les couleurs de la palette doivent être définies, si des couleurs de la palette ne sont pas exploitées alors celle-ci pourront être valorisées à 0x00 00 00.
4/ Déclaration des extensions (optionnel)
0x011 octetCaractère point d'exclamation (0x21) indiquant le début d'une extension0x21Dans le cadre de l'utilisation d'extensions, il est impératif d'utiliser une première extension décrivant avec quelle application seront exécutés les extensions. Si aucune extension n'est utilisée alors cette partie peut être supprimée.
0x021 octetIdentifiant de l'extension0xFFL'extension ayant l'identifiant 0xFF permet d'indiquer qu'il s'agit de l'extension d'initialisation permettant d'identifier l'application à utiliser pour interpréter les extensions suivantes
0x031 octetLongueur en octet de l'extension0x0BL'extension d'initialisation est définie sur 11 octets permettant d'indiquer le nom de l'application et sa version
0x04 à 0x0E11 octetsApplication servant à interpréter les extensions0x 4E 45 54 53 43 41 50 45 32 2E 30Les huit premiers octets indiquent l'application (NETSCAPE) et les trois suivant indiquent la version (2.0)
0x0F1 octetNombre d'octet indiquant le nombre de repétition de l'imagePar défaut cette valeur peut être valorisé à 0x03
0x101 octetRéservé0x01Cet octet est toujours valorisé à 0x01
0x11 jusqu'à la valeur définieNombre de répétition de l'imageSi ce nombre est valorisé à 0 cela signifie que les images boucleront à l'infini
0x131 octetCaractère de fin d'extension0x00Ce caractère permet d'indiquer que l'extension est finie
5/ Le corps de l'image
0x011 octetCaractère délimitant chaque image0x2CLe caractère virgule (,) indique le début d'une nouvelle image. La première image peut commencer directement à la suite de la palette de couleur commune ou peut être placée plus loin dans le fichier.
0x02 et 0x032 octetsDécalage de l'image par rapport au bord gauche en nombre de pixelLe format GIF autorise une (ré)écriture partielle de l'image affichée. Dans le cadre d'une image animée toute l'image seule la partie ayant changée peut-être redessinée. Ce nombre est écrit en LSB first.
0x04 et 0x052 octetsDécalage de l'image par rapport à la bordure haute en nombre de pixelEcrit en LSB first.
0x06 et 0x072 octetsLargeur de l'image à dessiner en nombre de pixelEcrit en LSB first.
0x08 et 0x092 octetsHauteur de l'image en nombre de pixelEcrit en LSB first.
0x0A1 octetDéfinition d'une palette de couleur local si nécessaireLa configuration des palettes locales s'effectue exactement de la même manière que pour la palette commune soit : - 1er bit : Indicateur de palette de couleur commune à toute l'image. Si le bit est valorisé à 1 alors une palette de couleur commune est définie (préconisé si l'image comporte un certain nombre de couleurs identiques). Si le bit est valorisé à 0 alors la palette commune n'est pas définie. - 2ᵉ, 3ᵉ et 4ᵉ bit : nombre de bit de la résolution de couleur. Par principe il est préférable d'utiliser un octet par couleur (RGB). C'est trois bit devront donc être valorisés à 1. - 5ᵉ bit : réservé - 6ᵉ, 7ᵉ et 8ᵉ bit : nombre de bit plus 1 nécessaire à l'adresse d'une couleur définie dans la palette de couleur générale commune. Par exemple si ces bits sont valorisés à 4 (100 en décimal) cela signifie que 5 bits seront nécessaires pour indiquer l'adresse d'une couleur dans la palette. 5 bits donnant la possibilité de coder 64 adresses, par conséquents 64 couleurs seront définies dans la palette.
5.1/ Extension propre à l'image (optionnelle)
0x011 octetCaractère de début d'extension0x21Le caractère 0x21 (! en ASCII) indique le début d'une extension
0x021 octetIndicateur du type de l'extensionCet octet indique le type d'extension, plusieurs types d'extensions existent dont : 0xF9 pour l'animation de l'image 0xFE pour une extension gérant des commentaires
0x031 octetTaille en nombre d'octets de l'extension0x04 pour les extensions d'animation
0x041 octetDescription du type d'animationLes trois premiers bits (ayant le poids le plus fort) sont réservés. Les trois bits suivants indiquent la méthode de changement d'image (décrit l'action qui est effectuée au moment du changement de l'image). Les différents types de changements sont les suivants : 001 (binaire) signifie que l'image précédente est laissée en place et que l'image suivante est dessinée par-dessus. 010 (binaire) signifie que l'image est entièrement redessinée depuis sa couleur de fond de fond défini dans la description de l'écran 011 (binaire) signifie que l'image est restaurée à son état précédent l'image que la prochaine image soit dessinée. Les valeurs suivantes ne sont pas encore définies. Le septième bit indique si une action est attendue (1) de la part de l'utilisateur pour passer à l'image suivante (0). Ce bit est majoritairement valorisé à 0. Le huitième bit indique si une couleur transparente est définie (1) ou non (0).
0x05 et 0x062 octetsDélais en centième de seconde (écrit en LSB) avant l'image suivante0x64 00 indique un délai d'une seconde avant de passer à l'image suivante
0x071 octetCaractère de fin d'extension0x00Indique la fin de l'extension et est toujours valorisé à 0x00
5.2/ Palette de couleur spécifique à l'image (optionnelle)
0x01 jusqu'à la définition de la dernière couleur de la paletteLe fonctionnement de la palette spécifique est identique à celui de la palette commune.
5.3/ Groupe de pixel composant l'image (plusieurs groupes de pixels peuvent être définis pour une même image)
0x011 octetNombre de bit minimal nécessaire au codage d'un indexe dans la liste des index compressés.Cette valeur correspond au nombre de bit minimal pour coder les indexes de couleur (voir ci-dessous) moins 1. Par conséquent cette donnée est valorisée du nombre de bit nécessaire pour coder une adresse de couleur dans la palette.
0x021 octetNombre d'octets composant la liste compressée des indexPlusieurs groupes de pixel peuvent se suivre pour composer une image. Chaque groupe de pixel commence en indiquant le nombre d'octets contenus dans la liste compressée des index (voir ci-dessous). Un groupe est considéré comme terminé quand ce nombre est atteint.
0x03 à maximum 0xFFde 1 octet à 255 octetsListe des adresses de couleurs composant l'imageCette partie relativement complexe du fait de la compression de l'image est détaillée ci-dessous
1 octetCaractère de fin de groupe0x00Le dernier groupe de pixel se termine par la valeur 0x00. On note également que cet emplacement aurait dû être utilisé pour indiquer la taille du prochain groupe. Celui-ci étant valorisé à 0 cela signifie que le prochain groupe n'existe pas. Il s'agit donc de la fin de l'image.
1 octetcaractère de fin de fichier0x3BPlusieurs images peuvent se suivre dans le fichier GIF, cela permet notamment de créer des images animées. La dernière image du fichier se termine par la valeur 0x3B représentant un point virgule (;)

Démonstration de l'écriture binaire d'une image

Pour illustrer cette partie l'image ci-dessous a été prise en exemple : (cliquez sur l'image pour la télécharger) Cette image est statique, elle n'utilise donc pas les extensions. L'image mesure 3 pixels de large et 3 pixels de haut et utilise la palette de couleur commune qui est composée des couleurs suivantes :
Bleu : 0x 00 00 FF
Orange : 0x F3 9C 12
Marron : 0x A5 6E 13
Rouge : 0x FF 00 00
En fonction des informations citées ci-dessous l’entête et la palette de couleur générique seront les suivants :
Nom de l'attributValeurCommentaire
Entête
Signature0x 47 49 46 38 39 61La signature utilisée est GIF89a
Largeur de l'image0x 03 003 pixels de large
Hauteur de l'image0x 03 003 pixels de haut
Configuration de la palette de couleur commune0x F1On définit une palette de couleur commune dont les couleurs sont codées sur un octet. Ce qui donne la valeur F. La palette sera composée de 4 couleurs, les adresses des couleurs s'écriront donc sur 2 bits. 00 (binaire) étant l'adresse de la première couleur de la palette, 01 (binaire) de la seconde, 10 (binaire) la troisième et 11 (binaire) de la dernière. Il est important de noter que toutes les couleurs de la palette ne sont pas obligatoirement utilisées. Si dans l'image en exemple, seules trois couleurs étaient utilisées, une quatrième aurait quand même dut être créée pour compléter la palette.
Adresse de la couleur de fond0x00On utilise la première couleur de la palette comme fond de l'image (cet attribut ne sera pas exploité dans cet exemple).
Réservé0x00Cet octet est réservé
palette de couleur commune
Couleur définit au premier index0x 00 00 FFBleu
Couleur définit au second index0x F3 9C 12Orange
Couleur définit au troisième index0x A5 6E 13Marron
Couleur définit au quatrième index0x FF 00 00Rouge
Corps de l'image
caractère délimitant le début de l'image0x 2CLe caractère virgule (,) délimite le début de l'image
Décalage par rapport au bord gauche0x 00 00Aucun décalage le dessin s'effectue sur toute l'image
Décalage par rapport à la bordure haute0x 00 00Aucun décalage le dessin s'effectue sur toute l'image
Largeur de l'image0x 03 00La partie de l'image à dessiner mesure 3 pixels de large car nous souhaitons redessiner toute la surface. Mais il est possible de redessiner uniquement une partie de la surface plus restreinte en dessinant une image plus petite.
Hauteur de l'image0x 03 00L'image à dessiner mesure 3 pixels de haut car nous souhaitons redessiner toute la surface mais celle-ci peut être plus petite
Définition de la palette spécifique si nécessaire0x 00L'image utilisera la palette commune
Nombre de bit minimal nécessaire au codage d'un indexe dans la liste des index compressés0x 02Les indexes du dictionnaire sont codés sur au moins 3 bits car les adresses des couleurs de la palette sont codés sur deux bits. Cette donnée est valorisée du nombre de bits utilisés moins 1 soit 0x02 pour 3 bits.
Nombre d'octets du groupe0x 04La liste compressée des index contient 4 octets. Il est possible d'avoir plusieurs listes compressées d'index se suivant, dans ce cas l'octet situé directement à la suite de la précédente liste indique le nombre d'octets de la nouvelle liste. Si le groupe suivant est indiqué ne possédant pas d'octet (valorisé à 0x00) alors l'image a fini d'être dessinée.
Liste compressée des index0x 0C 2C 37 51Voir ci-dessous le détail du calcul
Nombre d'octets du prochain groupe0x 00Seul une liste d'index est exploitée pour cette image.
Marquer de fin de fichier0x3Ble caractère point virgule (;) indique la fin du fichier

Description de l'algorithme de codage des pixels

1/ Lister les adresses de couleur de chaque pixel La première étape consiste à lister toutes les adresses des couleurs utilisées dans l'image en de la gauche vers la droite et du haut vers le bas.
Orange, adresse 1 1er pixelBleu, adresse 0 2ème pixelOrange, adresse 1 3ème pixel
Bleu, adresse 0 4ème pixelMarron, adresse 2 5ème pixelBleu, adresse 0 6ème pixel
Orange, adresse 1 7ème pixelRouge, adresse 3 8ème pixelOrange, adresse 1 9ème pixel
Les adresses des couleurs ainsi listés sont : 1 0 1 0 2 0 1 3 1 2/ Application de l'algorithme de compression LZW L'algorithme de compression LZW est relativement efficace et est très répandu. L'algorithme prend en entré un dictionnaire de caractères. Dans le cas d'un GIF il s'agit de la liste des adresses de couleur définies dans la palette (commune ou spécifique selon la configuration). Ainsi la valeur 0 correspondra à adresse de la couleur 0 soit au bleu dans le cas de l'image en exemple. En plus de la liste d'adresse deux valeurs sont ajoutées au dictionnaire : La première étant le code de nettoyage (clear code) obligatoire en début de section qui permet d'indiquer que le dictionnaire doit être vidé des valeurs constituées à la volée. Cette valeur correspond à l'adresse de la dernière couleur + 1. Dans cet exemple le code de nettoyage vaut 4 (100). La seconde entrée correspond au caractère de fin de groupe et se situe au à l'indexe suivant le code de nettoyage soit 5 (101). Le dictionnaire passé à l’algorithme de LZW est donc composé de la manière suivante :
Indexe dans le dictionnaireDescription
0Correspond à l'adresse de la première couleur de la palette. Dans cet exemple il s'agit de la palette commune, la première couleur est donc le bleu.
1Adresse de la seconde couleur de la palette. Ici l’orange.
2Adresse de la troisième couleur. Ici le marron.
3Adresse de la quatrième couleur. Ici le rouge.
4Code de nettoyage, premier code de la série.
5Code de fin de séquence à placer obligatoirement à la fin de la séquence.
L'algorithme effectuant la compression de la liste d'adresses des couleurs de chaque pixel est le suivant : Lit une à une chaque adresse de la liste à compresser, ici : 1 0 1 0 2 0 1 3 1 et l'ajoute au buffer
À chaque itération

	Si le contenu du buffer correspond à une entrée dans le dictionnaire :
		Rien n'est fait, passer au caractère suivant.
		
	Si le contenu du buffer ne correspond pas à une entrée dans le dictionnaire :
		Ajouter l'indexe correspondant au contenu de buffer (sauf le dernier caractère) dans la liste (compressée) des index.
		Ajouter le contenu du buffer (dernier caractère compris) dans le dictionnaire au prochain indexe libre.
		Vider le buffer.
L’exécution de cet algorithme est détaillé ci-dessous avec l'image d'exemple. En rose est indiqué le caractère lu durant l'étape en cours En bleu est indiqué le buffer actuellement constitué
N°étapeListe des index de couleur pour chaque pixel de l'imageEntrée ajoutée dans le dictionnaireListe compressée des index de couleurCommentaire
1 1 0 1 0 2 0 1 3 1 4 (code de nettoyage)Le code de nettoyage est toujours ajouté en début de liste. Le code 1 existe dans le dictionnaire, on n'écrit donc rien ni dans le dictionnaire ni dans la liste compressée.
2 1 0 1 0 2 0 1 3 1 index : 6 / Valeur : 1 04 1Le code 1 suivit de 0 n'existe pas dans le dictionnaire. On ajoute donc l'entrée “1 0” au dictionnaire à la première place de libre soit à l'index 6. Et on écrit le code du buffer sauf le dernier caractère. Ici le contenu du buffer est 1. La valeur 1 est ajouté à la liste compressée.
31 0 1 0 2 0 1 3 1 Index : 7 / Valeur : 0 14 1 0Pour la même raison, l'entrée 0 1 n'existe pas encore dans le dictionnaire, on l'ajoute donc à l'indexe 7. Et l'on enregistre le contenu du buffer.
41 0 1 0 2 0 1 3 1 4 1 0L'entrée 1 0 existant à présent dans le dictionnaire à l'index 6 aucune action n'est effectuée.
51 0 1 0 2 0 1 3 1 Index : 8 / Valeur : 1 0 24 1 0 6L'entrée 1 0 2 n'existant pas dans le dictionnaire on l'ajoute donc à l'index 8 et l'on enregistre le code du buffer soit 1 0 ce qui correspond à l'index 6 du dictionnaire. Le chiffre 8 s'écrivant au minimum sur 4 bits, le nombre de bit définissant les indexes doit de ce fait être incrémenté de 1.  À partir de cette étape tous les prochains indexes s'écriront sur 4 bits.
61 0 1 0 2 0 1 3 1 Index : 9 / Valeur : 2 04 1 0 6 2L'entrée 2 0 n'existant pas dans le dictionnaire on l'ajoute à l'indexe 9 et l'on code le contenu du buffer soit 2
71 0 1 0 2 0 1 3 1 4 1 0 6 2L'entrée 0 1 existe dans le dictionnaire à l'indexe 7 aucune action n'est donc effectuée.
81 0 1 0 2 0 1 3 1 Index : 10 / Valeur : 0 1 34 1 0 6 2 7Ajout de la valeur 0 1 3 au dictionnaire à l'index 10
91 0 1 0 2 0 1 3 1 index : 11 / valeur : 3 14 1 0 6 2 7 3 1 5Arrivé à la fin de la liste à compresser, le buffer est codé (ici l'index 1) et le caractère de fin de liste est ajouté : 5
A la fin du traitement le dictionnaire sera donc alimenté de la manière suivante :
Indexe dans le dictionnaireDescription
0Correspond à l'indexe de la première couleur de la palette. Dans cet exemple il s'agit de la palette commune, la première couleur est donc le bleu.
1Indexe de la seconde couleur de la palette. Ici l’orange.
2Indexe de la troisième couleur. Ici le marron.
3Indexe de la quatrième couleur. Ici le rouge.
4Code de nettoyage, premier code de la série.
5Code de fin de séquence à placer obligatoirement à la fin de la séquence.
6Cette entrée a été créée à l'étape 2 et représente la suite des index : 1 0
7Cette entrée a été créée à l'étape 3 et représente la suite des index : 0 1
8Cette entrée a été créée à l'étape 4 et représente la suite des index : 1 0
9Cette entrée a été créée à l'étape 6 et représente la suite des index : 2 0
10Cette entrée a été créée à l'étape 8 et représente la suite des index : 0 1 3
11Cette entrée a été créée à l'étape 9 et représente la suite des index : 3 1
La liste compressée des index de couleur sera donc : 4 1 0 6 2 7 3 1 5. On note cependant que sur un petit nombre de données ou sur des suites de couleur très différentes cette technique de compression n'est pas particulièrement efficace. Le dictionnaire constitué lors de la compilation peut être reconstruit automatiquement lors de la décompression. Par conséquent, dans un souci de gain d'espace mémoire le dictionnaire n'est pas sauvegardé dans le fichier. 3/ Encodage binaire de la liste compressée des index La liste compressée contenant les indexes ( 4 1 0 6 2 7 3 1 5 ) doit être convertie en format binaire pour pouvoir être sauvegardée. Cette étape nécessite la définition d'un nombre minimal de bit servant à coder les indexes. Ce chiffre est obtenu en ajoute 1 au nombre de bit servant à coder les adresses des couleurs de la palette. Dans le cas de l'image citée en exemple ce chiffre est de 3 bits pour coder les index de la palette de couleur. (Les adresses des couleurs de la palette étant codés sur 2 bits). Ensuite à chaque fois que l'index 2^(nombre actuel de bits nécessaires pour coder un index) sera créé dans le dictionnaire, le nombre de bits nécessaires à l'encodage d'un indexe sur incrémenté de 1. L'image d'exemple commence avec des index écris sur 3 bits. Par conséquent lorsque le 8ᵉ index (2^3) sera créé dans le dictionnaire les indexes suivant devront être codés sur 4 bits. Le nombre maximal de bit par indexe est défini à 12. Si un treizième bit est nécessaire il faudra une seconde liste d'index. La liste compressée des index s’écrira de la manière suivante en binaire :
Index410627315
Correspondance en binaire10000100011000100111001100010101
Les bits obtenus sont ensuite regroupés en octet. Ce regroupement repose sur deux étapes. La première étape consiste à écrire les indexes dans leur ordre inverse. Soit :
Index513726014
Correspondance en binaire01010001001101110010110000001100
Les bits sont ensuite découpés par groupe de 8 pour former des octets. Si le nombre total de bit n'est pas un multiple de 8, il est alors possible de compléter le dernier octet avec des bit de bourrage à 0. Cette liste d'octet et ensuite inversée (une nouvelle fois) :
Bits0101 | 00010011 | 01110010 | 110 | 000 | 001 | 100
Octets0x510x370x2C0x0C
Octets inversés0x0C0x2C0x370x51
La liste compressée des index de couleurs mis au format binaire est donc : 0x 0C 2C 37 51

Animation des images GIF

L'animation des images GIF s'effectue via l'utilisation d'extensions. Une extension est une suite d'octets donnant des instructions à l'application interprétant l'image. Comme pour les images, les extensions commencent avec un code d'identification qui est le point d'exclamation (0x21). L'octet suivant identifie le type d'extension. La première extension du fichier sert à déclarer l'application utilisée pour interpréter les extensions, son identifiant est 0xFF. Le troisième octet de l'extension sert à indiquer la longueur en nombre d'octets de l'extension. Les octets suivants correspondent au code de l'extension. Dans le cadre de l'animation d'une image, chaque image du fichier doit être précédée de l'extension d'animation. L'image suivante correspond à l'animation de l'image d'exemple. Cette image est dessinée en deux étapes la première, comme précédemment dessine l'ensemble de la surface. La seconde ne redessine que le pixel et le pixel central de la ligne du bas. Ce qui donne le résultat ci-dessous : (Cliquez sur l'image pour la télécharger) Ce fichier est construit de la manière suivante :
Nom de l'attributValeurCommentaire
Entête et palette de couleur commune
Entête de l'image et palette de couleur commune 47 49 46 38 39 61 03 00 03 00 F1 00 00 00 00 FF F3 9C 12 A5 6E 13 FF 00 00L'image mesure 3 pixels de large et 3 pixels de haut, et utilise une palette de couleur commune de 4 couleurs (voir section précédente pour plus de détail)
Déclaration des extensions
Indicateur de début d'extension0x21Les extensions commencent toujours par l'octet 0x21 (!)
Type d'extension0xFFL'extension d'initialisation est identifiée par la valeur 0xFF
Taille du premier bloc de l'extension0x0BL'extension d'initialisation est composée en deux sous blocs, le premier de 11 octets (0x0B) indique l'application à utiliser pour interpréter les extensions suivantes et le second passe les paramètres à l'application.
Identifiant de l'application à utiliser0x 4E 45 54 53 43 41 50 45 32 2E 30 NETSCAPE2.0 est l'application à utiliser, les 8 premiers octets indiquent l'application et les trois suivants la version de l'application
Taille du second bloc0x03Ce second bloque de trois octets permet d'indiquer le nombre de cycle où l'image est animée
Reservé0x01Reservé
Nombre de cycle0x00 00L'image se répétant à l'infini ces octets sont valorisés à 0
Indicateur de fin d'extension0x00
Extension d'animation de la première image
Indicateur de début d'extension0x 21Caractère (!) indiquant le début de l'extension
Indicateur du type d'extension0x F9Indique que l'extension sera du type “animation”
Taille de l'extension0x03L'extension est écrite sur 3 octets
Description du type d'animation0x04000 (binaire) réservé 010 (binaire) l'image précédente est laissée et la nouvelle image est dessinée par-dessus 0 (binaire) aucune action de l'utilisateur n'est attendue pour passer à l'image suivante 0 (binaire) aucune couleur transparente n'est définie
Délais pour le dessin de l'image suivante0x32 00Le délais est exprimé en 1/100 de secondes
Indicateur de fin d'extension0x00
Première image
Premier dessin0x 2C 00 00 00 00 03 00 03 00 00 02 04 0C 2C 37 51 00 Ce premier dessin dessine sur l'ensemble de la surface disponible, les détails techniques sont indiqués dans la section précédente
Seconde image et fin de fichier
Extension d'animation0x 21 F9 03 04 C8 00 00 Pour la seconde image le délai d'affichage est de 2 secondes (0x C8)
Composition de la seconde image0x 2C 01 00 01 00 01 00 02 00 00 02 02 1C 0A 00 Le seconde image consiste à redessiner uniquement le pixel central en rouge et le pixel au centre de la troisième ligne en bleu
Indicateur de fin d'image0x00
Indicateur de fin de fichier0x3B
Sources : Spécifications du format GIF d'après le consortium W3C Implémentation du format GIF (en anglais)