Structure d'un fichier TIFF non compressé


Le format TIFF non compressé est pratique pour manipuler aisément et efficacement les images à l'aide d'un langage de programmation. Ce format permet de gérer la transparence des images tout en assurant une qualité d'image maximale.

Cette page détaille la structure d'un fichier TIFF doté d'un canal de transparence et non compressé.

Pour voir les choses concrètement, on utilise une image test RGBA blanche de taille 600 x 400 pixels, dotée d'un canal de transparence alpha, créée puis enregistrée avec GIMP dans le format TIFF non compressé avec conservation des données alpha.

Création d'une image test

Lancer GIMP (version 2.8 par exemple). Cliquer "Fichier/Nouvelle image...". Saisir les valeurs 600 en largeur et 400 en hauteur puis cliquer "Valider".

1

Ajouter un canal de transparence à l'image ("Calque/Transparence/Ajouter un canal alpha")

2

Enregistrer l'image ("Fichier/Export As...")

3

Donner à l'image le nom "test-600-400.tiff", choisir le dossier "D:/test" par exemple, sélectionner le type de fichier TIFF puis cliquer "Exporter".

4

Cocher les options "Aucune compression" et "Enregistrer les valeurs de couleur pour les pixels transparents" puis cliquer "Exporter".

5

Ouvrir l'image à l'aide d'un éditeur Hexadécimal. Il en existe de nombreux gratuits comme Frhed par exemple.

6

Structure du fichier

L'examen des octets contenus dans le fichier "test-600-400.tiff" non compressé, ouvert avec un éditeur hexadécimal, fait apparaître le contenu suivant.

8

Ce contenu découle des spécifications du format TIFF. Ces spécification se déclinent de la façon suivante dans le cas d'un fichier TIFF non compressé, doté d'un canal alpha et enregistré avec GIMP.

7

Octets 0-1

fleche 49 49
indique que dans tout ce qui suit l'odre des octets doit être pris en compte en ordre inverse (l'octet le moins significatif est le plus significatif et inversement). Cet ordre de prise en compte des octets (appelé "big endian") s'applique aux entiers 16 et 32 bits. Ainsi, avec ce codage, xx yy doit être lu yy xx et vv ww xx yy doit être lu yy xx ww vv. Par exemple une adresse notée 08 A6 0E 00 (en hexadécimal) dans le fichier représente l'adresse 00 0E A6 08 c'est à dire 960008 en décimal

Octets 2-3

fleche 2A 00
c'est à dire 00 2A donc 42 en décimal. Indique que le fichier est de format TIFF.

Octets 4 à 7

Les octets 4 à 7 représentent l'adresse du répertoire du fichier ("Image File Directory" ou "IFD").Ce répertoire contient un certain nombre d'informations sur l'image (largeur, hauteur, nombre de canaux...). Ces informations sont découpées en blocs successifs de tailles fixes (12 octets pour chaque bloc). Ces blocs sont appelés entrées ("IFD Entries" ou plus simplement "Directory Entries"). Un IFD contient d'abord 2 octets qui représentent le nombre d'entrées qui viennent à la suite puis 12 octets par entrée. Un IFD contenant n IFD Entries est donc constitué de 2 + n x 12 octets.

fleche 08 A6 0E 00
représente 00 0E A6 08 c'est à dire 960008 en décimal. L'Image File Directory commence donc à l'adresse 960008, aussitôt après la fin des données rgba des pixels (FF FF FF FF dans le cas d'une image blanche opaque).
Remarques :
Les octets 0 à 7 constituent l'entête du fichier (Image File Header). Après cet entête, viennent les données rgba des pixels de l'image.
Dans le format TIFF tous les décalages (offsets) sont comptés par rapport au premier octet du fichier. Donc, dans un fichier TIFF, un offset représente l'adresse d'un octet, c'est à dire la position absolue de cet octet dans le fichier.

Octets 8 à 960007

Données rgba des 600 x 400 = 240000 pixels soient 600 x 400 x 4 = 960000 octets (chaque pixel rgba est codé FF FF FF FF dans le cas d'une image blanche 100% opaque).

Octets 960008 à 960009

fleche 12 00
c'est à dire 00 12 donc 18 en décimal représente le nombre de structures (Directory Entries, de 12 octets chacune) qui suivent. Dans le cas présent, ces structures occupent 18 x 12 = 216 octets. Elles se trouvent entre les adresses 960010 et 960225 et sont suivies de quatre zéros : 00, 00, 00, 00.

Viennent ensuite les 18 entrées. Chaque entrée (IFD Entry) est découpée de la façon suivante :
octets 0-1 : code (tag) qui indiquent le type d'information considérée
octets 2-3 : code (type) qui indiquent le type de la donnée qui va suivre (1 = unsigned integer, 2 = ASCII, 3 = SHORT 16-bit, 4 = LONG 32-bit, 5 = RATIONAL);
octets 4-7 : qui indiquent le nombre de données dans les 4 octets qui vont suivre (0,1,2,3 ou 4);
octets 8-11: qui indiquent la valeur de la donnée considérée ou l' adresse (dans le fichier) où se trouve cette donnée.

Octets 960010 à 960021 (IFD entry n°1) - NON UTILSE

fleche FE, 00, 04, 00, 01, 00, 00, 00, 00, 00, 00, 00
donc 00, FE, | 00, 04 | 00, 00, 00, 01 | 00, 00, 00, 00, 00
le tag 00FE donne une indication sur le type de données contenues dans le fichier. La valeur 00, 00, 00, 00 indique que ce champs n'est pas utilisé.

Octets 960022 à 960033 (IFD entry n°2) - LARGEUR IMAGE

fleche 00, 01, 03, 00, 01, 00, 00, 00, 58, 02, 00, 00,
donc 01, 00 | 00, 03 | 00, 00, 00, 01 | 00, 00, 02, 58 (600 en décimal)
le tag 0100 indique que ce qui suit concerne la largeur de l'image. 00 03 indique que la donnée qui suit (où celle qui est située à l'adresse qui suit) est un short. 00, 00, 00 ,01 indique que ce qui suit contient une seule donnée. 02 58 indique 600 pixels de large.

Octets 960034 à 960045 (IFD entry n°3) - HAUTEUR IMAGE

fleche 01, 01, 03, 00, 01, 00, 00, 00, 90, 01, 00, 00
donc 01, 01 | 00, 03 | 00, 00, 00, 01 | 00, 00, 01, 90 ( 400 en décimal)
le tag 0101 indique que ce qui suit concerne la hauteur de l'image. 01 90 indique 600 pixels de haut.

Octets 960046 à 960057 (IFD entry n°4) - BITS POUR R, G, B ET A

fleche 02, 01, 03, 00, 04, 00, 00, 00, F6, A6, 0E, 00
donc 01, 02 | 00, 03 | 00, 00, 00, 04 | 00, 0E, A6, F6 (960246 en décimal)
Le tag 0102 indique que ce qui suit représente le nombre de bits par composante de couleur rgba.
00 03 indique que la donnée qui est située à l'adresse qui suit est un short.
00, 00, 00, 04 indique qu'à partir de l'adresse indiquée ci-après, il y a 4 données de type short qui se suivent.
A partir de l'adresse 00 0E A6 F6 (960246 en décimal) on trouve bien quatre fois 08 00 c'est à dire 00 08 qui signifient que les composantes r, g, b et a ont chacune 8 bits.

Octets 960058 à 960069 (IFD entry n°5) - COMPRESSION

fleche 03, 01, 03, 00, 01, 00, 00, 00, 01, 00, 00, 00
donc 01, 03 | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 01
Le tag 0103 indique que ce qui suit concerne la commpression de l'image. La valeur 00 01 signifie qu'il n'y a pas de compression.

Octets 960070 à 960081 (IFD entry n°6) - ESPACE DE COULEUR

fleche 06, 01, 03, 00, 01, 00, 00, 00, 02, 00, 00, 00
donc 01, 06 | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 02
Le tag 0106 indique que ce qui suit concerne l'espace de couleur de l'image. La valeur 00 02 signifie RGB.

Octets 960082 à 960093 (IFD entry n°7) - NOM DU FICHIER

fleche 0D, 01, 02, 00, 19, 00, 00, 00, 36, A7, 0E, 00
donc 01, 0D | 00, 02 | 00, 00, 00, 19 | 00, 0E, A7, 36 (960310 en décimal)
Le tag 010D indique que ce qui suit concerne le nom du fichier image. La valeur 00, 00, 00, 19 (25 en décimal) signifie qu'il y a 25 caractères ascii (24 caractères de la chaine "D:\test\test-600-400.tif" + un 00 de fin de chaine) et l'adresse 00 0E A7 36 (960310 en décimal) renvoie à l'adresse du début de cette chaine.

Octets 960094 à 960105 (IFD entry n°8) - COMMENTAIRES

fleche 0E, 01, 02, 00, 12, 00, 00, 00, 50, A7, 0E, 00
donc 01, 0E | 00, 02 | 00, 00, 00, 12 | 00, 0E, A7, 50 (960336 en décimal)
Le tag 010E indique que ce qui suit concerne un commentaire permettant de décrire l'image. 00 02 et 00 12 signifient 18 caractères ascii. 00 0E A7 50 (960336 en décimal) signie que ces caractères commencent à l'adresse 960336 où l'on trouve bien "created with gimp" (17 caractères) suivie d'un 00 soient 18 caractères en tout.

Octets 960106 à 960117 (IFD entry n°9) - BANDES

fleche 11, 01, 04, 00, 07, 00, 00, 00, 1A, A7 0E 00
donc 01, 11 | 00, 04 | 00, 00, 00, 07 | 00, 0E, A7, 1A (960282 en décimal)
Le tag 0111 indique que ce qui suit concerne les bandes de l'image. Une image tiff est considérée comme étant découpées en "bandes" (strips) d'octets rgba consécutifs.
La valeur 7 indique que dans le cas présent, les données images sont découpées en 7 bandes consécutives.
00 0E A7 1A (960282 en décimal) indique l'adresse où se trouve l'adresse de la première bande sachant que les adresses des 6 bandes suivantes suivent aussitôt après
• 960282 à 960285 : adresse de la bande 1 : 08, 00, 00, 00 donc 00, 00, 00, 08 (8 en décimal)
• 960286 à 960289 : adresse de la bande 2 : 08, 58, 02, 00 donc 00, 02, 58, 08 (153608 en décimal)
• 960290 à 960293 : adresse de la bande 3 : 08, B0, 04, 00 donc 00, 04, B0, 08 (307208 en décimal)
• 960294 à 960297 : adresse de la bande 4 : 08, 08, 07, 00 donc 00, 07, 08, 08 (460808 en décimal)
• 960298 à 960301 : adresse de la bande 5 : 08, 60, 09, 00 donc 00, 09, 60, 08 (614408 en décimal)
• 960302 à 960305 : adresse de la bande 6 : 08, B8, 0B, 00 donc 00, 0B, B8, 08 (768008 en décimal)
• 960306 à 960310 : adresse de la bande 7 : 08, 10, 0E, 00 donc 00, 0E, 10, 08 (921608 en décimal)
• On constate que dans le cas présent, l'image lors de son enregistrement par gimp a été découpée en bandes de 153600 octets. Ona 600 x 64 (cf lignes par bande) = 38400 x 4 (octets par canal) = 153600

Octets 960118 à 960129 (IFD entry n°10) - ORIENTATION IMAGE

fleche 12, 01, 03, 00, 01, 00, 00, 00, 01, 00, 00, 00
donc 01, 12 | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 01
Le tag 0111 indique que ce qui suit concerne l'orientation de l'image. 00 01 signifie que la ligne 0 représente le haut de l'image et la colonne 0 le coté gauche de l'image

Octets 960130 à 960141 (IFD entry n°11) - COMPOSANTES DE COULEUR

fleche 15, 01, 03, 00, 01, 00, 00, 00, 04, 00, 00, 00
donc 01, 15 | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 04
Le tag 0115 indique que ce qui suit concerne le nombre de composantes de couleurs (canaux) par pixel - le nombre 4 signifie 4 canaux (rgba)

Octets 960142 à 960153 (IFD entry n°12) - LIGNES PAR BANDE

fleche 16, 01, 03, 00, 01, 00, 00, 00, 40, 00, 00, 00
donc 01, 16 | 00, 03 | 00, 00, 00, 01| 00, 00, 00, 40 (64 en décimal)
Le tag 0116 indique que ce qui suit concerne le nombre de lignes par bande (RowsPerStrip). 00 40 (64 en décimal).

Octets 960154 à 960165 (IFD entry n°13) - OCTETS PAR BANDE

fleche 17, 01, 04, 00, 07, 00, 00, 00, FE, A6, 0E, 00
donc 01, 17 | 00, 04 | 00, 00, 00, 07 | 00, 0E, A6, FE (960254 en décimal)
Le tag 0117 indique que ce qui suit concerne le nombre d'octets dans la bande (StripByteCounts) après compression. 00, 00, 00, 07, 00, 0E, A6, FE signifie 7 adresses à partir de l'adresse 960254
Ces 7 adresses contiennent
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 1
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 2
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 3
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 4
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 5
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 6
• 00, 96, 00, 00 donc 00, 00, 96, 00 (38400 en décimal) - nombre d'octets dans la bande 7
153600 x 6 = 921600 + 38400 = 960000 octets
remarque : 600 x 64 x 6 x 4 = 600 x 384 x 4 + 600 x 16 x 4 = 921600 + 38400 = 960000

Octets 960166 à 960177 (IFD entry n°14) - RESOLUTION HORIZONTALE

fleche 1A, 01, 05, 00, 01, 00, 00, 00, E6, A6, 0E, 00
donc 01, 0A | 00, 05 | 00, 00, 00, 01 | 00, 0E, A6, E6 ( 960230 en décimal)
Le tag 011A indique que ce qui suit concerne la résolution horizontale (dans le sens de la largeur de l'image). 00 05 indique que la donnée sera un nombre rationnel (une fraction). Cette donnée est à l'adresse 00, 0E, A6, E6 ( 960230 en décimal) où l'on trouve 48, 00, 00, 00, 01, 00, 00, 00 donc 00, 00, 00, 48 (72 en décimal) et 00, 00, 00, 01. La résolution horizontale de l'image est 72/1 = 72 dpi

Octets 960178 à 960189 (IFD entry n°15) - RESOLUTION VERTICALE

fleche 1B, 01, 05, 00, 01, 00, 00, 00, EE, A6, 0E, 00
donc 01, 1B | 00, 05 | 00, 00, 00, 01 | 00, 0E, A6, EE (960238 en décimal)
Le tag 011B indique que ce qui suit concerne la résolution verticale (dans le sens de la lhauteur de l'image). 00 05 indique que la donnée sera un nombre rationnel (une fraction). Cette donnée est à l'adresse 00 0E A6 EE (960238 en décimal) où l'on trouve 48, 00, 00, 00, 01, 00, 00, 00 donc 00, 00, 00, 48 (72 en décimal) et 00, 00, 00, 01. La résolution de l'image dans le sens vertical est 72/1 = 72 dpi

Octets 960190 à 960201 (IFD entry n°16) - POSITION DES COMPOSANTES DE COULEURS

fleche 1C, 01, 03, 00, 01, 00, 00, 00, 01, 00, 00, 00
donc 01, 1C | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 01
Le tag 011C indique que ce qui suit concerne la position relative des composantes de couleur. La valeur 00, 00, 00, 01 signifie que les composantes de couleur des pixels sont rangées les unes à la suite des autres dans le sens RGBA RGBA RGBA ...

Octets 960202 à 960213 (IFD entry n°17) - UNITE DE RESOLUTION

fleche 28, 01, 03, 00, 01, 00, 00, 00, 02, 00, 00, 00
donc 01, 28 | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 02
Le tag 0128 indique que ce qui suit concerne l'unité utilisée pour la résolution de l'image dans le sens horizontal et vertical. 00, 00, 00, 02 signifie que cette unitéest le pouce (inch).

Octets 960214 à 960225 (IFD entry n°18) - TRANSPARENCE

fleche 52, 01, 03, 00, 01, 00, 00, 00, 02, 00, 00, 00
donc 01, 52 | 00, 03 | 00, 00, 00, 01 | 00, 00, 00, 02
Le tag 0152 indique que ce qui suit concerne la transparence. La valeur 00 02 signifie que les valeurs des composantes de couleurs ne sont pas perdues ni arrondies dans le cas où l'image est partiellement ou entièrement tranparente.

Octets 960226 à 960229

fleche 00, 00, 00, 00
quatre octets à zéro marquant la fin de l'IFD.

Octets 960230 à 960237

fleche 48, 00, 00, 00, 01, 00, 00, 00
donc 00, 00, 00, 48 ( 72 en décimal) et 00, 00, 00, 01 signifie 72/1 = 72 dpi (résolution horizontale de l'image)

Octets 960238 à 960245

fleche 48, 00, 00, 00, 01, 00, 00, 00
donc 00, 00, 00, 48 ( 72 en décimal) et 00, 00, 00, 01 signifie 72/1 = 72 dpi (résolution vertitale de l'image)

Octets 960246 à 960253

fleche 08, 00, 08, 00, 08, 00, 08, 00
donc 00, 08 | 00, 08 | 00, 08 | 00, 08
signifie que les composantes r, g, b et a sont chacune constituées de 8 bits.

Octets 960254 à 960281

fleche 00, 58, 02, 00, 00, 58, 02, 00, 00, 58, 02, 00, 00, 58, 02, 00, 00, 58, 02, 00, 00, 58, 02, 00, 00, 96, 00, 00
On trouve les 7 valeurs qui représentent le nombre d'octets contenus dans les bandes 1 à 7
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 1
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 2
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 3
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 4
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 5
• 00, 58, 02, 00 donc 00, 02, 58, 00 (153600 en décimal) - nombre d'octets dans la bande 6
• 00, 96, 00, 00 donc 00, 00, 96, 00 (38400 en décimal) - nombre d'octets dans la bande 7

Octets 960282 à 960309

fleche 08, 00, 00, 00, 08, 58, 02, 00, 08, B0, 04, 00, 08, 08, 07, 00, 08, 60, 09, 00, 08, B8, 0B, 00, 08, 10, 0E, 00
donc 00, 00, 00, 08 | 00, 02, 58, 08 | 00, 04, B0, 08 | 00, 07, 08, 08 | 00, 09, 60, 08 | 00, 0B, B8, 08 | 00, 0E, 10, 08
• 00, 00, 00, 08 (décimal 8) représente l'adresse de début de la première bande
• 00, 02, 58, 08 (décimal 153608) représente l'adresse de début de la 2ème bande
• 00, 04, B0, 08 (décimal 307208) représente l'adresse de début de la 3ème bande
• 00, 07, 08, 08 (décimal 460808) représente l'adresse de début de la 4ème bande
• 00, 09, 60, 08 (décimal 614408) représente l'adresse de début de la 5ème bande
• 00, 0B, B8, 08 (décimal 768008) représente l'adresse de début de la 6ème bande
• 00, 0E, 10, 08 (décimal 921608) représente l'adresse de début de la 7ème bande

Octets 960310 à 960334

fleche 44, 3A, 5C, 74, 65, 73, 74, 5C, 74, 65, 73, 74, 2D, 36, 30, 30, 2D, 34, 30, 30, 2E, 74, 69, 66, 00
nom du fichier : 24 caractères de la chaine "D:\test\test-600-400.tif" + un 00 de fin de chaine

Octet 960335

fleche 00
un 00 supplémentaire.

Octets 960336 à 96353

fleche 43, 72, 65, 61, 74, 65, 64, 20, 77, 69, 74, 68, 20, 47, 49, 4D, 50, 00
"created with gimp" (17 caractères) suivie d'un 00 soient 18 caractères en tout .