# Portable Network Graphics

Le Portable Network Graphics (PNG, prononcé « ping ») est un format ouvert d’images numériques, qui a été créé pour remplacer le format GIF, qui utilise l'algorithme de compression de données sans perte LZW, soumis à un brevet et des royalties au bénéfice d'Unisys de décembre 1994 à 2006. Le PNG est un format sans perte spécialement adapté pour publier des images simples comprenant des aplats de couleurs.
Il a été normalisé par l’ISO (ISO/CEI 15948:2004).
PNG est une spécification pour Internet et l’objet d’une Recommandation W3C et d’une RFC. Il a été créé pour contourner la licence existante sur le format GIF, le plus en vogue à la fin des années 1990, Unisys, propriétaire de deux brevets sur des algorithmes utilisés par la compression sous GIF ayant réclamé des royalties. PNG a alors été défini mais en augmentant les capacités de GIF.

## Utilisation
### Pour les images synthétiques

PNG est particulièrement approprié lorsqu’il s’agit d’enregistrer des images synthétiques destinées au Web comme des graphiques, des icônes, des images représentant du texte (bonne conservation de la lisibilité), ou des images avec des dégradés. Le PNG surpasse régulièrement le format GIF en ce qui concerne la réduction de la taille des fichiers (avec une palette de couleurs bien choisie) ou la qualité (puisqu’il n’est pas limité à 256 couleurs).

### Pour les photos

Les caractéristiques de PNG lui permettent d’enregistrer des photographies sans perte de données, au détriment de la taille du fichier qui reste logiquement très supérieure à celle de formats avec perte de données destinés aux photographies, comme JPEG ou JPEG 2000.

## Détails sur le format

PNG permet principalement d’enregistrer les images matricielles sous différents formats :
* 1 bit donc deux couleurs
* 2 bits en 4 couleurs basiques
* 4 bits permettant de choisir parmi une palette de maximum 16 couleurs contenues dans le fichier
* 8 bits en niveaux de gris (256 niveaux)
* 8 bits permettant de choisir parmi une palette de maximum 256 couleurs contenues dans le fichier (équivalent au format GIF)
* 24 bits, soit 2$^{24}$ ou 16 777 216 couleurs (couleurs vraies, 256 couleurs par canal).
* 32 bits, soit 2$^{32}$ ou 4 294 967 296 couleurs.
* 48 bits, soit 2$^{48}$ ou 281 474 976 710 656 couleurs.
    Voir l’article Image numérique pour l’explication de ces notions.
Après l’application d’un filtre prédictif qui permet généralement d’obtenir de plus hauts niveaux de compression, le tout est compressé sans pertes suivant l’algorithme deflate (RFC 1951), généralement avec zlib, mais zopfli peut également être utilisé avec des applications comme advpng.
Les composantes des pixels ou les entrées de palette sont données soit au format RVB (rouge, vert, bleu), soit au format RVBA (avec un canal alpha supplémentaire pour la translucidité). Dans ce cas, 8 ou 16 bits supplémentaires sont utilisés par pixel ou par entrée de palette, ce qui fait 16 bits pour une image en niveaux de gris, 32 bits pour une image en couleurs vraies et 64 bits pour une image en 4 canaux de 16 bits chacun.

### La translucidité

La présence d’un canal alpha définissant différents niveaux de transparence le rend idéal pour la composition sur les pages web. Cette caractéristique est bien implémentée par la majorité des navigateurs web.

### La transparence

Lorsque l’image PNG utilise une palette de 256 couleurs maximum, il est possible d’utiliser une des couleurs pour la transparence.
C’est le même comportement qu’avec le format GIF et cela fonctionne même avec Internet Explorer 6. Par conséquent, les images Web au format GIF peuvent être converties en cette version de PNG sans crainte d’incompatibilité avec la majorité des navigateurs web actuels (premier trimestre 2006), et sans souci de brevet (le brevet GIF est entré en 2006 dans le domaine public).

### Autres comparaisons avec GIF

Le PNG, d’ailleurs parfois appelé par récursivité PNG’s Not GIF (PNG n’est pas GIF), peut faire tout ce que le format GIF peut faire et même plus, comme la translucidité. Il n’a cependant pas été prévu pour faire des images animées, mais le format dérivé MNG a été créé par ses auteurs à cet effet (voir également le format APNG).
Les deux formats peuvent être entrelacés, mais PNG utilise l'algorithme Adam7 tandis que GIF affiche dans ce cas l'image ligne par ligne.

## Structure d'un fichier PNG
### Composition minimale d'un fichier PNG

* signature PNG - 8 octets
* chunk IHDR pour l'en-tête - 13 octets
* chunk IDAT pour les données - longueur variable
* chunk IEND pour la fin de fichier - 12 octets
Un « chunk » est un gros morceau du fichier, un fragment d'information constituant une entité. Ce terme anglais est utilisé dans de nombreux formats multimédias.
Un fichier peut contenir plusieurs chunks de données IDAT ainsi qu'un chunk PLTE pour la palette à utiliser s'il s'agit d'une image dont les couleurs sont indexées.
Un fichier peut également contenir d'autres chunks secondaires, dont des informations textuelles.

### Signature PNG

Un fichier PNG commence par une signature de 8 octets représenté par les valeurs décimales suivantes : 137 80 78 71 13 10 26 10, ou en hexadécimal: 89 50 4E 47 0D 0A 1A 0A.
La suite du fichier est décomposée en plusieurs parties de longueurs variables, appelées chunk.

### Nommage des chunks

Il existe 18 chunks officiels, dont 4 principaux et 14 secondaires.
Les chunks sont étiquetés (nommés). La casse est importante dans les noms des chunks. Chaque étiquette est définie par quatre caractères successifs, définissant un code mnémonique, sous forme de fourCC. Pour chaque chunk, si la première lettre de son nom est en capitale il s'agit d'un chunk critique, sinon c'est un chunk auxiliaire.
Voici un tableau regroupant les chunks les plus utilisés (les quatre principaux en tête) :
| Nom | Description | Contient | Importance | Occurrence |
| IHDR | Image header En-tête du fichier | Largeur de l'image en pixels Hauteur de l'image en pixels Profondeur de bits (1, 2, 4, 8 ou 16) Type de couleur (0, 2, 3, 4, ou 6) Méthode de compression (0) Méthode de filtrage (0) Méthode d'entrelacement : 0 (sans) ou 1 (avec Adam7) | Obligatoire | Après la signature PNG |
| PLTE | Palette Palette de l'image | Table des couleurs | Facultatif | Entre IHDR et le 1er chunk IDAT |
| IDAT | Image data Bloc de données | Données de l'image | Obligatoire | Entre IHDR ou PLTE et IEND |
| IEND | Image trailer Fin du fichier | néant | Obligatoire | En dernier |
| tIME | Image last-modification time Horodatage | | Facultatif | N'importe où |
| iTXt | International textual data Info textuelle internationale (peut-être compressée zlib) | | Facultatif | N'importe où |
| tEXt | Textual data Info textuelle non-compressée | | Facultatif | N'importe où |
| zTXt | Compressed textual data Info textuelle compressée (zlib) | | Facultatif | N'importe où |
Les autres dix chunks secondaires sont :
| bKGD Background colour | pHYs Physical pixel dimensions |
| cHRM Primary chromaticities and white point | sBIT Significant bits |
| gAMA Image gamma | sPLT Suggested palette |
| hIST Image histogram | sRGB Standard RGB colour space |
| iCCP Embedded ICC profile | tRNS Transparency |
D'autres chunks peuvent également être définis. Ils sont soit publics, soit privés, mais doivent répondre au règles de nommage. Un chunk public doit avoir été enregistré auprès du W3C, l'autorité désignée par l'ISO/IEC.
Voici les chunks publics en usage :
| dSIG Digital Signature | oFFs Image offset |
| eXIf Exchangeable Image Format (Exif) Profile | pCAL Calibration of pixel values |
| fRAc Fractal image parameters | sCAL Physical scale of image subject |
| gIFg GIF Graphic Control Extension | sTER Indicator of Stereo Image |
| gIFx GIF Application Extension |

### Composition d'un chunk

Un chunk est composé de 4 parties:
| LENGTH | TYPE | DATAS | CRC |
| Longueur des données | Type de chunk | Données dont la longueur en octets est spécifiée dans LENGTH | Contrôle |
| 4 octets | 4 octets | n octets | 4 octets |
LENGTH : La taille en octets du chunk, seulement ses datas. On ne prend pas en compte la taille, le type, ni le CRC.
TYPE : Le nom du chunk (ex : IHDR, IDAT, IEND, etc.).
DATAS : Les informations relatives au chunk sur n octets (relatif à LENGTH).
CRC : 4 octets de contrôle généré en utilisant l'algorithme suivant :
Une fois tout le chunk parcouru, la valeur renvoyée par le dernier appel de maj_crc n'est pas celle du crc. il faut encore inverser la valeur de chaque bit :
La liste table_crc se trouvant dans maj_crc est constituée de valeurs arbitraires mais calculables. certaines implémentations listent ces valeurs (alors calculées à l'avance) et les stockent directement dans la variable tandis que d'autres contiennent l'algorithme (généralement une fonction) permettant de les calculer :

### Exemple d'un chunk IHDR pour une image de 800x600

L'exemple du chunk IHDR est constitué des données binaires, représentées ici en hexadécimal, suivantes :
00 00 00 0D 49 48 44 52 00 00 03 20 00 00 02 58 10 06 00 00 00 15 14 15 27
Ces données sont à interpréter selon le tableau.
| Données (en héxadécimal) | Description | Valeur (en décimal) |
| 00 00 00 0D | Longueur des données | 13 |
| 49 48 44 52 | Type/nom du chunk | IHDR |
| 00 00 03 20 | Largeur | 800 |
| 00 00 02 58 | Hauteur | 600 |
| 10 | Profondeur de bits | 16 |
| 06 | Type de couleur | 6 |
| 00 | Méthode de compression | 0 |
| 00 | Méthode de filtrage | 0 |
| 00 | Méthode d'entrelacement | 0 |
| 15 14 15 27 | CRC | 353637671 |

## Compression des données

La méthode de compression 0 spécifiée dans IHDR (la seule possible au format PNG) fait référence à la compression Deflate/Inflate. La compression se fait sur les datas du chunk IDAT uniquement.

### En Programmation

La compression peut être effectuée grâce à la bibliothèque zlib (C/C++). Il est aussi possible de générer le CRC grâce à cette bibliothèque.