Fiche technique | |
---|---|
Type | Bitmap |
Méthode de compression | LZW |
Nombre maximum de couleurs | 256 couleurs |
Taille maximum de l'image | 65536 x 65536 pixels (il est recommandé de ne pas dépasser la limitation de nombreux logiciels tiers à 16000 x 16000) |
Supporte plusieurs images | Oui, plusieurs images peuvent être présente dans un même fichier |
Supporte la transparence | Oui |
Format des nombres | Little-endian |
Date de conception | 1987 |
Auteur | CompuServe, Inc. |
Plateforme | MS-DOS, DR-DOS, Macintosh, Unix, Linux, Solaris, Amiga,... |
Introduction
L'extension de fichier «.GIF» permet d'indiquer un fichier graphique de format GIF (abréviation de «Graphics Interchange Format»). Il s'agit d'un format de fichier développé par CompuServe en 1987 utilisant un algorithme de compression LZW. Il fut très populaire dans les années 1990. Une grande partie du succès du format provient de CompuServe lui-même, ayant sûrement été le plus célèbre de tous les systèmes BBS en ligne. L'entreprise CompuServe a déployé des efforts considérables pour contrôler le format GIF et sa diffusion. Le format GIF est l'un des très rares formats ayant été officiellement protégés par des droits d'auteur. Le format GIF est modérément complexe à mesure que les formats graphiques disparaissaient. Une grande partie de cette complexité est le résultat de sa conception pour une gestion optimale dans les paramètres de télécommunications, en particulier la transmission via modem. Lorsque le format est apparu pour la première fois, les modems à 300 bauds étaient encore communs et les modems à 2400 bauds étaient assez chers. Tout ce qui pouvait être fait pour raccourcir les temps de transmission était généralement utilisé. À cette fin, le format GIF a été conçu pour utiliser la compression LZW, pour prendre en charge l'entrelacement d'images et pour utiliser, entre autres, une structure orientée paquets. La spécification GIF originale a été publiée en 1987 et est appelée la version 87a du format. Une révision de format a été publiée deux ans plus tard et est connue sous le nom de version 89a. La version 89a apporte diverses extensions à la version 87a précédente sans altérer les spécificités de ce format, donc 89a est un véritable surensemble de 87a. Il s'avère que la version originale du format 87a définit un protocole de données pour les extensions de format mais ne définit aucune extension spécifique. Ils ont tous été ajoutés dans la version 89a. Tout décodeur de format mettant en oeuvre correctement la spécification 87a devrait être capable de lire les fichiers de la version 89a et de simplement ignorer les extensions. Cependant, de nombreux décodeurs de ce type recherchent la chaîne de format 87a dans l'entête d'un fichier GIF dans le cadre du processus de vérification de fichier et ne traitent généralement pas un fichier 89a. De plus, la plupart des extensions 89a ne sont pas pertinentes si le format est utilisé simplement comme support d'entreposage pour une seule image Bitmap. Les extensions définissent des éléments tels que les avertissements textuelle d'une image, des commentaires de nature non critique et la manière dont les interactions avec l'utilisateur d'un visualiseur GIF doivent être gérées. Ceux-ci sont principalement intéressants si l'intention est de créer une sorte de diaporama interactif à partir d'un fichier GIF.
Structure du fichier
Un fichier GIF est constitué d'un ensemble de blocs de données différents. Le diagramme suivant montre les différents types de blocs et leur emplacement logique dans le fichier. Le fichier commence en haut et se termine en bas et certaines parties (la partie médiane) peuvent se répété afin d'inclure plusieurs images. A chaque branche du diagramme, vous pouvez aller dans une direction un autre. Ainsi, elle peut être répété autant de fois que nécessaire ou simplement être omis (dans le cas ou l'image en entier serait transparent).
Structure d'entête du fichier
Tous les fichiers GIF doivent commencer par un bloc d'entête de fichier. Elle commence pour indiquer la signature qu'il s'agit d'un GIF (nom du format GIF) occupe les 6 premiers octets du fichier. Elle est suivi des informations d'écran logiques, d'une table de couleur (aussi parfois appeler une palette de couleur). Voici la structure de l'en-tête d'un fichier GIF 87a et 89a :
Déplacement | Taille | Description | |
---|---|---|---|
00h à 05h | 6 octets | Ce champ permet d'indiquer le nom du format GIF ('GIF87a' ou 'GIF89a') | |
06h à 07h | 1 mot | Ce champ permet d'indiquer le nombre de pixels sur l'axe des X (horizontal) | |
08h à 09h | 1 mot | Ce champ permet d'indiquer le nombre de pixels sur l'axe des Y (vertical) | |
0Ah | 1 octet | Ce champ permet d'indiquer les informations étendue suivant : | |
Bit(s) | Description | ||
0 à 2 |
Nombre de palettes : 0: 2 palettes 1: 4 palettes 2: 8 palettes 3: 16 palettes 4: 32 palettes 5: 64 palettes 6: 128 palettes 7: 256 palettes |
||
3 à 7 | Réservé | ||
0Bh | 1 octet | Ce champ permet d'indiquer l'arrière plan (Background) | |
0Ch | 1 octet | Ce champ permet d'indiquer le ratio | |
0Dh | 3 * 2 << (déplacement 0Ah) ∩ 7 octets | Ce champ permet d'indiquer la table de couleur (Color Map) | |
3 * 2 << (déplacement 0Ah) ∩ 7 | 1 octet + Extra | Ce champ permet d'indiquer l'identificateur | |
... | 1 octet | Ce champ permet d'indiquer l'identificateur |
NB: Les symboles «<<» permettent d'indiquer un opérateur de décalage de bit à gauche (SHL en langage de programmation Turbo Pascal ou «<<» en langage de programmation C). Les symboles «∩» permettent d'indiquer un opérateur «Et binaire logique», soit une table de vérité appliqué à chacun des bits de la valeur. Le terme «Extra» permet d'indiquer les informations supplémentaire de taille variable contenu avec la structure de l'identificateur. L'expression «déplacement 0Ah» permet d'indiquer la valeur contenu dans le champ en déplacement 0Ah.
Structure de l'identificateur
Type | Description | ||||
---|---|---|---|---|---|
';' | Fin | ||||
'!' | Extension | ||||
Taille | Description | ||||
Jusqu'à un code ASCII 0 soit rencontré | Donnée de compression de l'image | ||||
',' | Séparateur d'image | ||||
Déplacement | Taille | Description | |||
00h à 03h | 4 octets | Ce champ est réservé | |||
04h à 05h | 1 Mot | Ce champ permet d'indiquer la longueur (Nombre de pixels X) | |||
06h à 07h | 1 Mot | Ce champ permet d'indiquer la largeur (Nombre de pixels Y) | |||
08h | 1 octet | Bits 0 à 2: Nombre de palettes : | |||
Code | Description | ||||
0 | 2 palettes | ||||
1 | 4 palettes | ||||
2 | 8 palettes | ||||
3 | 16 palettes | ||||
4 | 32 palettes | ||||
5 | 64 palettes | ||||
6 | 128 palettes | ||||
7 | 256 palettes | ||||
Bit 3 à 5: Réservé (??) Bit 6: Interlacé Bit 7: Drapeau de la table de couleur (Color Map Flag) |
|||||
09h | 1 octet | Taille du code d'entrée (Valide de 2 à 11) Image... |
Donnée de compression de l'image
Cette partie contient les données d'images réelles. Ainsi, les données sont composées d'une série de codes de sortie indiquant au décodeur les couleurs à produire sur le résultat de l'image. Ces codes sont combinés dans les octets constituant le bloc. Le premier octet de ce bloc est la taille de code minimale de la compression LZW. Cette valeur est utilisée pour décoder les codes de sortie compressés. Le reste des octets représente des sous-blocs de données. Les sous-blocs de données sont des groupes de 1 à 256 octets. Le premier octet du sous-bloc vous indique le nombre d'octets de données réelles à suivre. Il peut être une valeur de 0 (00h) à 255 (FFh). Une fois que vous avez lu ces octets, le prochain octet que vous lisez vous indiquera maintenant que de nombreux autres octets de données suivent celui-ci. Vous continuez à lire jusqu'à atteindre un sous-bloc indiquant que 0 octet suit.
Exemple
Voici un exemple montrant la structure de ce format suivant en Turbo Pascal 7 :
- Type
- {Entête de fichier de format GIF}
- HeaderGIF=Record
- Sign,Ver:Array[0..2]of Char; { Signature et version (GIF87a ou GIF89a)}
- NumXPixels,NumYPixels:Word; { Largeur et hauteur de l'image en pixels }
- ExtInfo, { Information de palettes }
- Background, { Arrière plan }
- AspectRatio:Byte; { Ratio }
- End;
-
- {Entête d'image du fichier de format GIF}
- HeaderImageGIF=Record
- Seperator:Byte; { Séparateur ',' }
- X1,Y1:Word; { Position X,Y ou commence l'image }
- NumXPixels,NumYPixels:Word; { Largeur et hauteur de l'image }
- ExtInfo:Byte; { Information de palettes }
- End;
Voir également
Langage de programmation - Traitement d'image - Accueil
Langage de programmation - Théorie des codes - Compression - LZW