Adresse du groupe | Taille du groupe | Nom de l'attribut | Valeur | Informations supplémentaires |
---|---|---|---|---|
1/ Signature du fichier | ||||
0x01 à 0x06 | 6 octets | Signature | GIF(suivit de la version) soit : 0x47 49 46 X X X | Les 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 0x02 | 2 octets | Largeur de l'image en pixel | Codé 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 0x04 | 2 octets | Hauteur de l'image | Codé en LSB first comme pour la largeur | |
0x05 | 1 octet | Paramétrage de la palette comune | 0xF(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. |
0x06 | 1 octet | Adresse de la couleur de fond | La 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 à 0x03 | 3 octets | Valeur de la couleur définie à l'indexe 0 | Les 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 à 0x06 | 3 octets | Valeur de la couleur définie à l'indexe 1 | Les couleurs sont écrites dans l'ordre RGB | |
0x07 jusqu'à la définition de la dernière couleur de la palette | 3 octets | Valeur de chaque couleur de la palette | Toutes 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) | ||||
0x01 | 1 octet | Caractère point d'exclamation (0x21) indiquant le début d'une extension | 0x21 | Dans 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. |
0x02 | 1 octet | Identifiant de l'extension | 0xFF | L'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 |
0x03 | 1 octet | Longueur en octet de l'extension | 0x0B | L'extension d'initialisation est définie sur 11 octets permettant d'indiquer le nom de l'application et sa version |
0x04 à 0x0E | 11 octets | Application servant à interpréter les extensions | 0x 4E 45 54 53 43 41 50 45 32 2E 30 | Les huit premiers octets indiquent l'application (NETSCAPE) et les trois suivant indiquent la version (2.0) |
0x0F | 1 octet | Nombre d'octet indiquant le nombre de repétition de l'image | Par défaut cette valeur peut être valorisé à 0x03 | |
0x10 | 1 octet | Réservé | 0x01 | Cet octet est toujours valorisé à 0x01 |
0x11 jusqu'à la valeur définie | Nombre de répétition de l'image | Si ce nombre est valorisé à 0 cela signifie que les images boucleront à l'infini | ||
0x13 | 1 octet | Caractère de fin d'extension | 0x00 | Ce caractère permet d'indiquer que l'extension est finie |
5/ Le corps de l'image | ||||
0x01 | 1 octet | Caractère délimitant chaque image | 0x2C | Le 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 0x03 | 2 octets | Décalage de l'image par rapport au bord gauche en nombre de pixel | Le 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 0x05 | 2 octets | Décalage de l'image par rapport à la bordure haute en nombre de pixel | Ecrit en LSB first. | |
0x06 et 0x07 | 2 octets | Largeur de l'image à dessiner en nombre de pixel | Ecrit en LSB first. | |
0x08 et 0x09 | 2 octets | Hauteur de l'image en nombre de pixel | Ecrit en LSB first. | |
0x0A | 1 octet | Définition d'une palette de couleur local si nécessaire | La 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) | ||||
0x01 | 1 octet | Caractère de début d'extension | 0x21 | Le caractère 0x21 (! en ASCII) indique le début d'une extension |
0x02 | 1 octet | Indicateur du type de l'extension | Cet 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 | |
0x03 | 1 octet | Taille en nombre d'octets de l'extension | 0x04 pour les extensions d'animation | |
0x04 | 1 octet | Description du type d'animation | Les 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 0x06 | 2 octets | Délais en centième de seconde (écrit en LSB) avant l'image suivante | 0x64 00 indique un délai d'une seconde avant de passer à l'image suivante | |
0x07 | 1 octet | Caractère de fin d'extension | 0x00 | Indique 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 palette | Le 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) | ||||
0x01 | 1 octet | Nombre 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. | |
0x02 | 1 octet | Nombre d'octets composant la liste compressée des index | Plusieurs 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 0xFF | de 1 octet à 255 octets | Liste des adresses de couleurs composant l'image | Cette partie relativement complexe du fait de la compression de l'image est détaillée ci-dessous | |
1 octet | Caractère de fin de groupe | 0x00 | Le 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 octet | caractère de fin de fichier | 0x3B | Plusieurs 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 (;) |
Bleu : 0x 00 00 FF |
Orange : 0x F3 9C 12 |
Marron : 0x A5 6E 13 |
Rouge : 0x FF 00 00 |
Nom de l'attribut | Valeur | Commentaire |
---|---|---|
Entête | ||
Signature | 0x 47 49 46 38 39 61 | La signature utilisée est GIF89a |
Largeur de l'image | 0x 03 00 | 3 pixels de large |
Hauteur de l'image | 0x 03 00 | 3 pixels de haut |
Configuration de la palette de couleur commune | 0x F1 | On 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 fond | 0x00 | On utilise la première couleur de la palette comme fond de l'image (cet attribut ne sera pas exploité dans cet exemple). |
Réservé | 0x00 | Cet octet est réservé |
palette de couleur commune | ||
Couleur définit au premier index | 0x 00 00 FF | Bleu |
Couleur définit au second index | 0x F3 9C 12 | Orange |
Couleur définit au troisième index | 0x A5 6E 13 | Marron |
Couleur définit au quatrième index | 0x FF 00 00 | Rouge |
Corps de l'image | ||
caractère délimitant le début de l'image | 0x 2C | Le caractère virgule (,) délimite le début de l'image |
Décalage par rapport au bord gauche | 0x 00 00 | Aucun décalage le dessin s'effectue sur toute l'image |
Décalage par rapport à la bordure haute | 0x 00 00 | Aucun décalage le dessin s'effectue sur toute l'image |
Largeur de l'image | 0x 03 00 | La 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'image | 0x 03 00 | L'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écessaire | 0x 00 | L'image utilisera la palette commune |
Nombre de bit minimal nécessaire au codage d'un indexe dans la liste des index compressés | 0x 02 | Les 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 groupe | 0x 04 | La 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 index | 0x 0C 2C 37 51 | Voir ci-dessous le détail du calcul |
Nombre d'octets du prochain groupe | 0x 00 | Seul une liste d'index est exploitée pour cette image. |
Marquer de fin de fichier | 0x3B | le caractère point virgule (;) indique la fin du fichier |
Orange, adresse 1 1er pixel | Bleu, adresse 0 2ème pixel | Orange, adresse 1 3ème pixel |
Bleu, adresse 0 4ème pixel | Marron, adresse 2 5ème pixel | Bleu, adresse 0 6ème pixel |
Orange, adresse 1 7ème pixel | Rouge, adresse 3 8ème pixel | Orange, adresse 1 9ème pixel |
Indexe dans le dictionnaire | Description |
---|---|
0 | Correspond à 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. |
1 | Adresse de la seconde couleur de la palette. Ici l’orange. |
2 | Adresse de la troisième couleur. Ici le marron. |
3 | Adresse de la quatrième couleur. Ici le rouge. |
4 | Code de nettoyage, premier code de la série. |
5 | Code de fin de séquence à placer obligatoirement à la fin de la séquence. |
À 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°étape | Liste des index de couleur pour chaque pixel de l'image | Entrée ajoutée dans le dictionnaire | Liste compressée des index de couleur | Commentaire |
---|---|---|---|---|
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 0 | 4 1 | Le 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. |
3 | 1 0 1 0 2 0 1 3 1 | Index : 7 / Valeur : 0 1 | 4 1 0 | Pour 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. |
4 | 1 0 1 0 2 0 1 3 1 | 4 1 0 | L'entrée 1 0 existant à présent dans le dictionnaire à l'index 6 aucune action n'est effectuée. | |
5 | 1 0 1 0 2 0 1 3 1 | Index : 8 / Valeur : 1 0 2 | 4 1 0 6 | L'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. |
6 | 1 0 1 0 2 0 1 3 1 | Index : 9 / Valeur : 2 0 | 4 1 0 6 2 | L'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 |
7 | 1 0 1 0 2 0 1 3 1 | 4 1 0 6 2 | L'entrée 0 1 existe dans le dictionnaire à l'indexe 7 aucune action n'est donc effectuée. | |
8 | 1 0 1 0 2 0 1 3 1 | Index : 10 / Valeur : 0 1 3 | 4 1 0 6 2 7 | Ajout de la valeur 0 1 3 au dictionnaire à l'index 10 |
9 | 1 0 1 0 2 0 1 3 1 | index : 11 / valeur : 3 1 | 4 1 0 6 2 7 3 1 5 | Arrivé à 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 |
Indexe dans le dictionnaire | Description |
---|---|
0 | Correspond à 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. |
1 | Indexe de la seconde couleur de la palette. Ici l’orange. |
2 | Indexe de la troisième couleur. Ici le marron. |
3 | Indexe de la quatrième couleur. Ici le rouge. |
4 | Code de nettoyage, premier code de la série. |
5 | Code de fin de séquence à placer obligatoirement à la fin de la séquence. |
6 | Cette entrée a été créée à l'étape 2 et représente la suite des index : 1 0 |
7 | Cette entrée a été créée à l'étape 3 et représente la suite des index : 0 1 |
8 | Cette entrée a été créée à l'étape 4 et représente la suite des index : 1 0 |
9 | Cette entrée a été créée à l'étape 6 et représente la suite des index : 2 0 |
10 | Cette entrée a été créée à l'étape 8 et représente la suite des index : 0 1 3 |
11 | Cette entrée a été créée à l'étape 9 et représente la suite des index : 3 1 |
Index | 4 | 1 | 0 | 6 | 2 | 7 | 3 | 1 | 5 |
---|---|---|---|---|---|---|---|---|---|
Correspondance en binaire | 100 | 001 | 000 | 110 | 0010 | 0111 | 0011 | 0001 | 0101 |
Index | 5 | 1 | 3 | 7 | 2 | 6 | 0 | 1 | 4 |
---|---|---|---|---|---|---|---|---|---|
Correspondance en binaire | 0101 | 0001 | 0011 | 0111 | 0010 | 110 | 000 | 001 | 100 |
Bits | 0101 | 0001 | 0011 | 0111 | 0010 | 110 | 0 | 00 | 001 | 100 |
---|---|---|---|---|
Octets | 0x51 | 0x37 | 0x2C | 0x0C |
Octets inversés | 0x0C | 0x2C | 0x37 | 0x51 |
Nom de l'attribut | Valeur | Commentaire |
---|---|---|
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 00 | L'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'extension | 0x21 | Les extensions commencent toujours par l'octet 0x21 (!) |
Type d'extension | 0xFF | L'extension d'initialisation est identifiée par la valeur 0xFF |
Taille du premier bloc de l'extension | 0x0B | L'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 à utiliser | 0x 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 bloc | 0x03 | Ce second bloque de trois octets permet d'indiquer le nombre de cycle où l'image est animée |
Reservé | 0x01 | Reservé |
Nombre de cycle | 0x00 00 | L'image se répétant à l'infini ces octets sont valorisés à 0 |
Indicateur de fin d'extension | 0x00 | |
Extension d'animation de la première image | ||
Indicateur de début d'extension | 0x 21 | Caractère (!) indiquant le début de l'extension |
Indicateur du type d'extension | 0x F9 | Indique que l'extension sera du type “animation” |
Taille de l'extension | 0x03 | L'extension est écrite sur 3 octets |
Description du type d'animation | 0x04 | 000 (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 suivante | 0x32 00 | Le délais est exprimé en 1/100 de secondes |
Indicateur de fin d'extension | 0x00 | |
Première image | ||
Premier dessin | 0x 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'animation | 0x 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 image | 0x 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'image | 0x00 | |
Indicateur de fin de fichier | 0x3B |