RFC: 2083
Statut : Proposition
Retour à l'index des normes : INDEX FRANCAIS
Ce chapitre expose la représentation des données de base utilisée dans les fichiers PNG, ainsi que la représentation attendue pour les données de l'image.
Tout entier nécessitant un codage sur plus d'un octet doit présenter ces octets dans l'ordre du réseau: l'octet le plus signifiant est envoyé en premier, puis les octets suivants dans l'ordre décroissant de poids (MSB LSB pour des entiers sur deux octets, B3 B2 B1 B0 pour des entiers sur 4 octets). Le bit de poids fort (valeur 128) est toujours appelé le bit 7; celui de plus faible poids (valeur 1) est numéroté 0. Les valeurs sont non signées, sauf mention explicite contraire. Les valeurs déclarées explicitement comme signées sont inscrites en complément à 2. Cf. Motivations(*): Ordre des octets (Section 12.5).
(*) seront traduites ultérieurement
Les couleurs peuvent être représentées soit par une échelle de gris, soit par un triolet d'entiers codant les trois couleurs primaires RVB (rouge, vert, bleu). L'échelle de gris représente la luminance; les données RGB représentent une information de couleur calibrée (si le segment cHRM est présent) ou non calibrée et donc dépendant de l'environnement (si cHRM est absent). Toutes les valeurs de couleur sont comprises entre 0 (représentant le noir, ou l'absence de lumière) et la valeur d'intensité maximale pour la plus grande valeur codable. Notez que la plus grande valeur possible pour une "profondeur" d'échantillonnage donnée en bits est (2^profondeur)-1, et non pas 2^profondeur.
La plage de valeur ainsi définie n'est pas nécessairement linéaire; le segment gAMA spécifie les caractéristiques gamma de l'environnement source, et les clients de visualisation pourront utiliser ce segment pour effectuer les compensations nécessaires. Cf. correction Gamma (Section 2.7).
Des données source d'une précision non supportée par PNG (par exemple, couleur vraie sur 5 bit/pixel) doivent être converties au codage immédiatement supérieur supporté par PNG. Cette mise à l'échelle est réversible et doit se faire sans perte d'information, et permet de réduire le nombre de cas que les décodeurs doivent implémenter. Cf. Recommandations pour les encodeurs: Conversion de profondeur de couleur (Section 9.1) et Recommandations pour les Décodeurs (Section 10.4).
Du point de vue du concept, une image PNG est un tableau rectangulaire de pixels, ceux-ci apparaissant de gauche à droite à l'intérieur de chaque ligne de scan, et les lignes apparaissant de haut en bas. (Pour réaliser la fonction d'affichage progressif, les données sont en fait transmises dans un autre ordre, Cf. Entrelacement des données (Section 2.6.) La taille de chaque pixel est donnée par la profondeur d'échantillonnage en bits, correspondant au nombre de bits nécessaires pour coder un pixel de l'image source. Trois types de pixels sont supportés:
Optionnellement, les modèles en niveaux de gris et en vraies couleurs peuvent disposer d'un échantillon supplémentaire pour le canal alpha, décrit dans la section suivante.
Les pixels sont toujours organisés en lignes, successivement, et sans bits perdus entre chaque pixel. Les pixels codés sur un nombre de bits inférieur à un octet ne peuvent être rangés à cheval sur deux octets; Ils sont placés dans l'octet à partir du bit de poids fort. Les profondeurs autorisées et les modèles de pixel sont limités de telle sorte que l'organisation des octets reste simple et efficace.
PNG autorise des modèles de pixels multi-échantillons de 8- et 16-bits. De ce fait, ces pixels ne peuvent tenir dans un seul octet. Des échantillons 16-bits sont stockés selon l'ordre de transmission réseau (MSB en premier).
Les lignes commencent toujours sur le début d'un octet. Lorsque le codage du pixel est inférieur à 8 bits et la largeur de ligne n'est pas divisible par le nombre de pixels par octet, les bits de poids faible du dernier octet de la ligne sont perdus. La valeur de ces bits perdus n'est pas précisée.
Un octet spécial de "type de filtre" est ajouté en début de chaque ligne (voir Filtrage Section 2.5). L'octet de type de filtre n'est pas considéré comme faisant part de données image, mais il est inclus dans le flux de données envoyé à l'étage de compression.
Un canal alpha, représentant la transparence sur la base du pixel, peut être incluse dans des images PNG en niveaux de gris ou en vraies couleurs.
Une valeur alpha de zéro attribuée à un pixel représente la transparence totale, et une valeur de (2^profondeur)-1 indique que le pixel est complètement opaque. Les valeurs intermédiaires indiquent une transparence partielle du pixel, combinant la couleur de celui-ci avec celle du fond de façon à former une image composite. (Ainsi, la couche alpha est réellement le degré d'opacité du pixel. Cependant, nombreux sont ceux pour lesquels la couche alpha transporte une information de transparence, plutôt que d'opacité. Nous continuerons dans ce sens).
Un canal Alpha peut être intégré dans un image de profondeur 8 ou 16 bits par échantillon, mais pas dans celles de profondeur inférieure à 8 bits. Les échantillons Alpha sont représentés avec la même profondeur que les autres canaux (ceux des couleurs de base). L'échantillon alpha de chaque pixel est stocké immédiatement après la valeur de luminance pour le modèle en "niveau de gris" ou après l'échantillon bleu pour le modèle RVB.
Les valeurs d'échantillons de couleur du pixel ne sont pas affectées par la valeur de l'échantillon alpha du même pixel. Il s'agit d'un modèle appelé parfois "non associé" ou alpha "non-premultiplié". (Une autre technique courante est d'enregistrer les échantillons de couleur une fois multipliés par la valeur du canal alpha; en effet, cela revient à avoir composé à l'avance l'image finale sur un fond noir. PNG n'utilise pas la technique de pré-multiplication alpha).
Le contrôle de transparence est possible sans payer le coût (en termes de poids d'image) d'un canal alpha complet. Dans une image en couleurs indexées, une valeur d'alpha peut être définie pour chaque entrée de palette. Dans des images en niveaux de gris ou en vraies couleurs, il sera possible d'affecter la transparence à une valeur particulière de couleur des pixels. Ces techniques sont contrôlées par le segment auxiliaire tRNS.
Si aucun canal alpha ni segment tRNS ne sont présents, tous les pixels de l'image seront considérés comme opaques.
Les navigateurs pourront supporter le traitement de la transparence, entièrement ou en partie seulement. Cf. Motivations: Alpha Non-prémultiplié (Section 12.8), Recommandations pour les Encodeurs: Création de canal Alpha (Section 9.4), et Recommandations pour les Décodeurs: Traitement du canal Alpha (Section 10.8).
Le format PNG permet le filtrage des données de l'image avant compression. Ce filtrage peut dans certains cas améliorer le gain de compression à suivre. L'étage de filtrage lui-même ne réduit pas la taille des données. Tous les filtres PNG sont strictement non destructifs.
Le format PNG définit divers algorithmes de filtrage, dont "None" pour lequel aucune modification n'est apportée aux données. L'algorithme de filtrage utilisé est spécifié pour chaque ligne par un octet dit de "type de filtre" précédant le flux de données d'image pour chaque ligne devant être envoyée à l'étage de compression. Un encodeur intelligent pourrait commuter le type de filtre d'une ligne d'image à l'autre. La méthode pour choisir quel est le filtrage à appliquer est du ressort de l'encodeur. Cf. Algorithmes de Filtrage (Chapitre 6) et Motivations: Filtrage (Section 12.9).
Une image PNG peut être enregistrée selon un ordre entrelacé afin d'en permettre un affichage par définition progressive. L'idée de ce mécanisme est de pouvoir afficher une ébauche de l'image le plus tôt possible lorsqu'elle est consultée via un réseau, sa définition augmentant au fur et à mesure que l'image est chargée. L'entrelacement augmente légèrement la taille totale de l'image, mais donne une impression de plus grande rapidité de chargement à l'utilisateur final. Notez que les décodeurs actuels sont sensés lire toute image entrelacée, même s'ils ne peuvent gérer l'affichage progressif pour l'utilisateur final.
Selon la méthode d'entrelacement notée 0, les pixels sont enregistrés séquenciellement de gauche à droite, et les lignes enregistrées séquenciellement de haut en bas (non entrelacé).
Selon la méthode d'entrelacement notée 1, appelée aussi Adam7 d'après le nom de son auteur, (Adam M. Costello), les pixels sont organisés de façon à permettre 7 passes d'affichage de l'image. Chaque passe transmet un sous-ensemble de pixels de l'image. Pour savoir quels pixels sont à envoyer dans la passe courante, il suffit de répéter le schéma suivant sur l'image, en partant du coin gauche supérieur. Seront à transmettre les bits correspondants au numéro de la passe sur le masque suivant:
1 6 4 6 2 6 4 6
7 7 7 7 7 7 7 7
5 6 5 6 5 6 5 6
7 7 7 7 7 7 7 7
3 6 4 6 3 6 4 6
7 7 7 7 7 7 7 7
5 6 5 6 5 6 5 6
7 7 7 7 7 7 7 7
La transmission de chaque passe suit le diagramme d'entrelacement ci-dessus, toujours de gauche à droite et de haut en bas. Par exemple, la passe 2 envoie les pixels 4, 12, 20, etc. des lignes 0, 8, 16, etc. (0,0 correspond au coin gauche supérieur de l'image). La dernière passe envoie les lignes entières 1, 3, 5, etc.
Les données dans chaque passe sont disposées comme s'il s'agissait d'une image de dimensions appropriées. Par exemple, si l'image complète fait 16 par 16 pixels, la passe 3 contiendrait deux lignes, chacune transmettant quatre pixels. Si les pixels sont codés sur moins de 8 bits, chaque ligne est complétée de bits de bourrage jusqu'à faire un nombre entier d'octets (Cf. Codage de l'image, Section 2.3). L'image réduite ainsi obtenue est filtrée comme toute image normale, et un octet de type de filtrage est ajouté à chacune de ses lignes (Cf. Algorithmes de Filtrage, Chapitre 6). Remarquez que l'ordre de transmission est défini de telle sorte que toutes les lignes transmises dans la même passe soient composées du même nombre de pixels; Ceci est rendu nécessaire pour l'application correcte de certains filtres.
Attention : Si l'image contient moins de cinq colonnes ou cinq rangées, certaines passes seront complètement ignorées. Les encodeurs et décodeurs doivent attentivement implémenter ce cas. En particulier, les octets de type de filtre ne sont ajoutés que pour des lignes non vides; ils ne sont pas ajoutés dans les lignes d'une passe vide. Cf. Motivations: Entrelacement (Section 12.6) et Recommandations pour les Décodeurs: affichage progressif (Section 10.9).
Les images PNG peuvent spécifier, via le segment gAMA, les caractéristiques gamma de l'image selon les conditions de sa création. Nous encourageons les programmes amenés à afficher ces images d'utiliser ces informations, plus l'information indiquant le type de moniteur ayant servi à la création d'image, ainsi que les conditions de lumière ambiante lors de cette création. Le but étant d'exploiter ces informations pour diffuser l'image sur le destinataire avec un rendu de contraste et de qualité la plus proche possible de l'intention originale du créateur. Cf. Introduction au Gamma (Chapitre 13) si vous n'êtes pas familier de ces techniques.
La correction gamma n'est pas appliquée au canal alpha, s'il existe. Les échantillons alpha représentent en effet un codage toujours linéaire de l'opacité.
Pour des applications de haute précision, le chromatisme exact des données RVB peut être spécifié par le segment cHRM dans l'image PNG, permettant une correspondance de couleurs encore plus serrée que ce que la simple correction gamma peut générer. Cf. Introduction aux Couleurs (Chapitre 14) si vous n'êtes pas familier des techniques de représentation de couleurs.
Cf. Motivations: Pourquoi le gamma? (Section 12.7), Recommandations pour les Encodeurs: Insertion des données gamma (Section 9.2), et Recommandations pour les Décodeurs: Gestion du gamma (Section 10.5).
Un fichier PNG peut enregistrer du texte associé à l'image, tel qu'une description de l'image, ou une mention de copyright. Des mots-clef sont prévus pour indiquer la signification de chaque texte. L'usage de la table de caractères ISO 8859-1 (Latin-1) est recommandé pour ces données [ISO-8859]. Il s'agit d'un surensemble de l'ASCII 7- bits.
Les codes de caractères non définis dans l'ensemble Latin-1 devront être évités, car leur signification dépend alors de l'environnement. Si un caractère non-Latin-1 apparaissait dans une chaîne de texte d'un fichier PNG, son interprétation pourra varier selon les plates-formes et les décodeurs. Certains systèmes pourront même être incapables d'afficher tous les caractères de l'ensemble Latin-1, bien que la plupart des systèmes actuels le fasse sans problème.
Des fonctions de stockage de texte sous forme compressé sont prévus. Cf. Motivations: Chaînes de texte (Section 12.10).