Comment un PNG est assemblé
Un PNG commence par une signature de huit octets, une empreinte fixe qui permet à n'importe quel programme de confirmer que le fichier est bien un PNG. Tout ce qui suit est une série dechunks, et chaque chunk est un petit paquet bien rangé : une longueur, un type de quatre lettres, les données elles-mêmes et une somme de contrôle de quatre octets.
Trois types de chunk portent l'image entière. IHDR vient en premier et stocke l'essentiel : largeur, hauteur, profondeur de bits et type de couleur. IDAT contient les données d'image compressées, parfois réparties sur plusieurs chunks IDAT à la suite.IEND est un minuscule marqueur de fin qui indique que le fichier est complet. À l'intérieur des chunks IDAT, les pixels sont compressés avec deflate, le même algorithme que celui qu'utilise ZIP, un unique flux continu de la ligne du haut de l'image jusqu'à celle du bas.
Un PNG, du début à la fin : une signature, un en-tête avec les dimensions, les données d'image compressées et un marqueur de fin.
Le détail qui rend le PNG spécial, c'est la somme de contrôle sur chaque chunk. C'est un CRC-32, calculé sur le type et les données du chunk, et il fait du format quelque chose qui s'audite en permanence. C'est pourquoi un PNG peut pointer ses propres dommages avec une précision que la plupart des formats n'atteignent pas.
Les dommages qu'un PNG peut encaisser
Parce que chaque chunk se vérifie et se décrit lui-même, toute une catégorie de dommages du PNG a un correctif propre et déterministe : la bonne réponse peut être connue, non devinée.
Une somme de contrôle fausse, des données justes
Le cas le plus bénin : les données d'un chunk sont intactes mais son CRC stocké ne correspond plus, si bien que les décodeurs stricts rejettent le fichier. Recalculer le CRC à partir des données et le réécrire rend le fichier de nouveau valide sans aucune perte. La somme de contrôle était la seule chose de travers.
Dimensions à zéro ou erronées
Si la largeur ou la hauteur de l'IHDR est mise à zéro ou brouillée, aucun décodeur ne peut préparer de canevas et le fichier ne s'ouvre pas. Mais l'IHDR porte son propre CRC, calculé à l'époque où les dimensions étaient correctes. Cela permet à un outil de réparation de trouver la réponse par force brute : essayer des valeurs candidates de largeur et de hauteur, recalculer la somme de contrôle pour chacune, et s'arrêter dès qu'elle correspond au CRC stocké. Les dimensions d'origine sortent directement du calcul, sans rien deviner.
Sauts de ligne massacrés au transfert
Un classique : un PNG envoyé via un système qui convertit les fins de ligne « pour rendre service », un vieux client FTP en mode texte, ou un script qui a réécrit le fichier comme du texte. Il remplace chaque paire retour-chariot et saut-de-ligne par un saut de ligne seul, ou l'inverse, corrompant des octets un peu partout. La signature du PNG est justement conçue pour repérer exactement cela, et quand le massacre est une substitution cohérente et réversible, la transformation peut être défaite et les octets d'origine restaurés.
Troncature : les lignes du haut reviennent
La troncature est la façon la plus courante dont un PNG casse : un téléchargement arrêté à 80 pour cent, une copie interrompue au retrait d'un disque, un fichier enregistré par un programme qui a planté en pleine écriture. L'avant du fichier est intact et la fin est tout simplement absente, en général y compris le marqueur IEND, et c'est pourquoi tant de visionneuses se plaignent que le fichier est incomplet.
Un PNG tronqué : l'en-tête et le haut des données d'image ont survécu ; le reste du flux et le marqueur de fin ne sont jamais arrivés.
Comme l'image est écrite de haut en bas, un PNG tronqué se sauve dans la partie supérieure de la photo : de vrais pixels, jusqu'au point où les données s'arrêtent. Une réparation réécrit une fin valide pour qu'un décodeur accepte le fichier et dessine ce qui a survécu. Les lignes sous la coupure ne sont pas endommagées, elles sont absentes, donc elles ne peuvent pas être rendues. C'est un partiel honnête, le même type de résultat qu'un JPEG tronqué donne du côté de la réparation photo.
Dommage en plein flux : pourquoi les lignes du dessous disparaissent
Un dommage qui tombe au milieu des données IDAT, plutôt qu'à la fin, est le cas difficile, et la raison en est deflate. Deflate compresse l'image comme un unique flux continu où chaque partie dépend de ce qui l'a précédée. Il n'a aucun marqueur périodique sur lequel se resynchroniser, si bien que dès que le décodeur rencontre un octet corrompu, il perd le fil et ne peut pas le retrouver. Tout ce qui suit le dommage se décode en bruit.
En pratique, cela veut dire qu'un seul octet défectueux à mi-hauteur peut vous coûter toutes les lignes situées en dessous, pas seulement une ligne. L'image est propre au-dessus de l'impact et n'est que déchets en dessous. Une réparation peut tout de même sauver les lignes qui se sont décodées avant le dommage, ce qui vaut vraiment la peine, mais elle ne peut pas recoudre le flux au-delà de la cassure. Comparez cela aux formats qui stockent un index séparément de leurs données : là, reconstruire l'index peut tout sauver. Le PNG garde ses pixels dans un unique flux deflate indivisible, si bien qu'une blessure en plein flux est permanente sous la coupure.
Ce qui est récupérable, en une liste honnête
Rangez votre PNG cassé dans l'une de ces cases et vous connaissez le pronostic avant de dépenser le moindre effort :
- Somme de contrôle qui ne correspond pas, données intactes.Correctif déterministe, sans perte. Recalculez le CRC et le fichier redevient valide.
- Dimensions à zéro ou brouillées. Correctif déterministe dans la plupart des cas. La somme de contrôle stockée de l'IHDR révèle la taille d'origine.
- Massacre des sauts de ligne au transfert. Réversible quand la substitution était cohérente. Défaites la transformation, restaurez les octets.
- Fichier tronqué. Partiel. Le haut de l'image revient ; la fin manquante, non.
- Corruption d'IDAT en plein flux. Partiel au mieux. Propre au-dessus du dommage, perdu en dessous, parce que deflate ne peut pas se resynchroniser.
- Zéro octet ou tout à zéro. Ce n'est pas un cas de réparation. Il n'y a aucune image dans le fichier à reconstruire ; c'est un problème de récupération.
La réparation de PNG se trouve à côté des outils pour les autres formats dans l'index des outils de réparation. Quelle que soit la case dans laquelle tombe votre fichier, un bon outil vous dit la vérité à son sujet plutôt que de vous promettre le retour des lignes grises.
FAQ
Pourquoi mon PNG ne s'ouvre-t-il pas ?
En général l'une de trois choses : la signature de huit octets tout au début est endommagée, si bien que les visionneuses ne reconnaissent pas du tout le fichier comme un PNG ; le chunk d'en-tête (IHDR) qui stocke les dimensions de l'image est erroné ou mis à zéro, si bien qu'un décodeur ne peut pas préparer de canevas ; ou les données d'image compressées ont été tronquées ou corrompues en cours de route. Les deux premiers cas sont souvent des correctifs déterministes, parce que le PNG stocke une somme de contrôle pour chaque chunk. Le troisième est là où commencent les limites honnêtes : les lignes d'image qui n'étaient pas dans le fichier ne peuvent pas être ramenées.
Que signifie une erreur de CRC dans un PNG ?
Chaque chunk d'un PNG se termine par une somme de contrôle CRC-32 de quatre octets calculée sur le type et les données de ce chunk. Quand un décodeur recalcule la somme de contrôle et qu'elle ne correspond pas à la valeur stockée, il signale une erreur de CRC, ce qui veut dire que les octets de ce chunk ont changé depuis l'écriture du fichier. Si seule la somme de contrôle elle-même est erronée et que les données sont intactes, la recalculer répare le fichier entièrement. Si les données ont changé, le CRC fait son travail en vous prévenant, et le degré de récupérabilité de l'image dépend du chunk touché.
Peut-on récupérer un PNG tronqué ?
Partiellement, et seulement le haut. Le PNG compresse son image avec deflate et écrit les lignes de haut en bas, si bien qu'un fichier coupé court se décode proprement jusqu'au point où les données s'arrêtent, puis s'interrompt. Vous récupérez la partie supérieure de l'image sous forme de vrais pixels. Les lignes situées sous la coupure n'ont jamais été dans le fichier, donc aucun outil ne peut les restaurer. Un PNG tronqué réparé est un partiel honnête : votre vraie image, aussi loin que vont les octets.
Pourquoi le bas de mon PNG est-il manquant ou brouillé ?
Parce que deflate, la compression qu'utilise le PNG, est un flux continu sans aucun moyen de se resynchroniser après un dommage. Si la corruption tombe au milieu des données d'image plutôt qu'à la fin, le décodeur perd le fil à cet octet et tout ce qui suit se décode en bruit, pas seulement la seule ligne endommagée. C'est pourquoi un dommage en plein flux vous coûte généralement toutes les lignes situées sous l'impact, tandis qu'une troncature nette laisse au moins le haut intact.
Une photo qui s'ouvre sur une moitié inférieure grise a un cousin proche dans le monde du JPEG : pourquoi la moitié de votre JPEG sort en gris.