RFC: 2083
Retour à l'index des normes : INDEX FRANÇAIS
Statut : Proposition

PORTABLE NETWORKS GRAPHIC 1.0

SPECIFICATION



Crédits : Thomas Boutell / Boutell Com Inc
Traduction : V.G. FREMAUX

Précédent - Suite - Retour au sommaire

3. Structure du fichier

Un fichier PNG consiste en une signature PNG suivi d'une série de blocs. Ce chapitre définit la signature ainsi que les propriétés générales des blocs. Le détail de chaque bloc est précisé dans les chapitres suivants.

3.1.Signature d'un fichier PNG

Les huit premiers bits d'un fichier PNG contiennent toujours les valeurs suivantes (en décimal) :

        137 80 78 71 13 10 26 10

Cette signature indique que le reste du fichier contient une seule image codée selon en PNG, consistant en une série de blocs dont le premier est un bloc IHDR et le dernier un bloc IEND. Cf Motivations: Signature de fichier PNG (Section 12.11).

3.2. Structure de bloc

Chaque bloc est constitué de quatre parties:

Longueur

Un entier non-signé sur 4 octets donnant le nombre d'octets de la partie données du bloc. Cette longueur n'est calculée que sur la partie "données", ne se compte pas elle-même, ni les parties "type", ni le CRC. Zéro est donc une longueur possible. Bien que les encodeurs et décodeurs soient sensés interpréter ce paramètre comme un entier non signé, on limitera sa valeur à (2^31)-1.

Type de bloc

Un code de type de bloc sur 4 octets. Pour faciliter l'implémentation et l'examen de fichiers PNG, ces codes se présenteront sous forme d'un groupe de lettres ASCII (A-Z et a-z, ou 65-90 et 97-122 en décimal). Cependant, les encodeurs et décodeurs devront toujours interpréter ces lettres en tant que valeurs numériques, et jamais sous forme d'une chaîne de caractères. Par exemple, le code de type IDAT n'est pas équivalent à celui formé par les quatre lettres équivalentes en EBCDIC. Les conventions nommant les divers types de blocs sont exposées dans les chapitres suivants.

Données

Les octets de données, s'il y en a, et selon le type de bloc. Cette partie peut être vide.

CRC

Un CRC (Cyclic Redundancy Check) sur 4 octets, calculé à partir des octets précédents du même bloc, tenant compte du type et des données, mais pas de la longueur. Le CRC est tout le temps présent, même pour des blocs ne contenant aucune données. Voir l'algorithme du CRC (Section 3.4). Le nombre d'octets de données peut être quelconque tant qu'il reste inférieure à la limite supérieure; de ce fait, les programmeurs ne pourront être assurés qu'un bloc sera aligné au delà de l'octet.

Les blocs peuvent apparaître dans un ordre quelconque, hormis certaines restrictions définies pour chacun des types spécifiés. (Une restriction notable est qu'un bloc IHDR doit toujours apparaître en premier, et un bloc IEND en dernier; ainsi, le bloc IEND sert de marqueur de fin de fichier). On pourra trouver plusieurs blocs d'un type donné, mais seulement si ce type le permet. Cf Motivations: Structure des blocs (Section 12.12).

3.3. Conventions d'appellation des blocs

Les codes de type sont nommés de telle sorte qu'un décodeur peut déduire certaines propriétés d'un bloc même lorsque le code de type n'est pas reconnu. Ces règles sont instituées pour permettre une extension sure et souple du format PNG, en permettant a un décodeur de décider du traitement à effectuer lorsqu'un bloc de type inconnu est rencontré. Ces règles d'appellation n'ont que peu d'intérêt lorsque le décodeur reconnaît le type de bloc.

Quatre bits particuliers dans le type (le bit 5 - valeur 32- dans chacun des 4 octets) sont utilisés pour transmettre des propriétés du bloc. Ce choix permet une lecture facile des propriétés "à vue" selon si chaque lettre composant le type est majuscule (bit 5 à 0) ou minuscule (bit 5 à 1). Un décodeur devra quant à lui tester numériquement la valeur de ces bits pour déduire les propriétés d'un bloc inconnu; le test de la casse sur une interprétation caractère est insuffisant, et peut même conduire à une interprétation erronée, suivant l'implémentation locale des tables de caractères.

Il est important de noter que les bits de propriétés des blocs sont une partie indissociable du nom du bloc, et de ce fait sont fixés pour un type de bloc prédéfini. De ce fait, deux blocs TEXT et Text sont des blocs entièrement différents, et non le même bloc doté de propriétés différentes. Les décodeurs devront reconnaître les types de blocs par une comparaison littérale numérique des quatre octets du code de type; il est donc tout à fait illicite d'opérer des changements de casse sur les types de blocs.

La sémantique des bits de propriétés est la suivante :

Les règles à appliquer par des éditeurs PNG sont décrites par la suite dans la section Règles d'Ordonnancement des Blocs (Chapitre 7).

Par exemple, le nom de bloc hypothétique "bLOb" présente les propriétés suivantes :

  bLOb  <-- code "de.class" tppabs="http://www.eisti.fr/eistiweb/docs/normes/rfc2083/de.class" type sur 32 bits sous forme texte
  ||||
  |||+- marqueur de copie à 1    (minuscule; bit 5 à 1)
  ||+-- marqueur réservé 0       (majuscule; bit 5 à 0)
  |+--- marqueur privé à 0       (majuscule; bit 5 à 0)
  +---- marqueur auxiliaire à 1  (minuscule; bit 5 à 1)

Dans cet exemple, le nom représente un bloc auxiliaire, public, sûr en copie. Cf. Motivations: Conventions d'appellation des blocs (Section 12.13).

3.4. Algorithme de CRC

Les CRC des blocs sont calculés selon une méthode standard de calcul des CRC, avec pre et post conditionnement, définie dans la norme ISO 3309 [ISO-3309] ou ITU-T V.42 [ITU-V42]. La fonction polynomiale

         x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1

est employée.

Le registre 32-bits de calcul est initialisé avec des 1. Les données de chaque octet sont traitées depuis le bit de poids faible (1) jusqu'au bit de poids fort (128). Une fois tous les octets de données traités, le registre CRC est inversé (on prend son complément à un). Cette valeur est transmise (enregistrée dans le fichier) les poids forts en tête. Pour achever la séparation en octets et leur ordonnancement, le bit de poids faible du CRC sur 32-bit est pris comme le coefficient du terme x^31.

En pratique, le calcul du CRC se base sur une table calculée à l'avance afin d'en accélérer le traitement. Cf. CRC des Echantillons (Chapitre 15).


Précédent - Suite - Retour au sommaire