Anleitungen

PNG lässt sich nicht öffnen: Chunks, CRCs und was sich retten lässt

Ein PNG ist ungewöhnlich ehrlich über den eigenen Schaden. Jeder Block darin trägt eine Prüfsumme, sodass das Format oft genau sagen kann, was schiefgelaufen ist, und manchmal auch, wie man es rückgängig macht. Genau diese Struktur zieht aber auch eine harte Grenze: Manche Schäden sind eine saubere, deterministische Reparatur, und manche nehmen den unteren Teil deines Bildes für immer mit.

Wie ein PNG zusammengesetzt ist

Ein PNG beginnt mit einer acht Byte langen Signatur, einem festen Fingerabdruck, an dem jedes Programm bestätigen kann, dass die Datei wirklich ein PNG ist. Alles danach ist eine Folge vonChunks, und jeder Chunk ist ein ordentliches kleines Paket: eine Länge, ein vierstelliger Typ, die Daten selbst und eine vier Byte lange Prüfsumme.

Drei Chunk-Typen tragen das gesamte Bild. IHDR kommt zuerst und speichert das Wesentliche: Breite, Höhe, Bittiefe und Farbtyp.IDAT enthält die komprimierten Bilddaten, manchmal auf mehrere aufeinanderfolgende IDAT-Chunks verteilt. IENDist eine winzige Endmarkierung, die sagt, dass die Datei vollständig ist. Innerhalb der IDAT-Chunks sind die Pixel mit deflate komprimiert, demselben Algorithmus, den auch ZIP verwendet, als ein durchgehender Datenstrom von der obersten Zeile des Bildes bis zur untersten.

Ein PNG von vorne bis hinten: eine Signatur, ein Header mit den Abmessungen, die komprimierten Bilddaten und eine Endmarkierung.

Das Detail, das PNG besonders macht, ist die Prüfsumme auf jedem Chunk. Es ist ein CRC-32, berechnet über Typ und Daten des Chunks, und es macht aus dem Format etwas, das sich ständig selbst überprüft. Deshalb kann ein PNG auf den eigenen Schaden mit einer Genauigkeit zeigen, die die meisten Formate nicht hinbekommen.

Der Schaden, den ein PNG wegsteckt

Weil jeder Chunk sich selbst prüft und sich selbst beschreibt, hat eine ganze Kategorie von PNG-Schäden eine saubere, deterministische Lösung: Die richtige Antwort ist bekannt, nicht geraten.

Falsche Prüfsumme, richtige Daten

Der harmloseste Fall: Die Daten eines Chunks sind in Ordnung, aber sein gespeicherter CRC passt nicht mehr, deshalb weisen strenge Decoder die Datei ab. Den CRC aus den Daten neu zu berechnen und zurückzuschreiben macht die Datei ohne jeden Verlust wieder gültig. Die Prüfsumme war das Einzige, was falsch war.

Auf null gesetzte oder falsche Abmessungen

Wird die Breite oder Höhe in IHDR auf null gesetzt oder durcheinander gebracht, kann kein Decoder eine Zeichenfläche aufbauen, und die Datei öffnet nicht. Aber IHDR trägt seinen eigenen CRC, berechnet damals, als die Abmessungen noch korrekt waren. Das erlaubt einem Reparatur-Tool, die Antwort per Brute-Force zu finden: Kandidatenwerte für Breite und Höhe durchprobieren, für jeden die Prüfsumme neu berechnen und stoppen, sobald sie mit dem gespeicherten CRC übereinstimmt. Die ursprünglichen Abmessungen fallen direkt aus der Rechnung, ganz ohne Raten.

Beim Übertragen verstümmelte Zeilenumbrüche

Ein Klassiker: ein PNG, das durch ein System geschickt wurde, das Zeilenenden „hilfreich“ umwandelt, ein alter FTP-Client im Textmodus oder ein Skript, das die Datei als Text neu geschrieben hat. Es ersetzt jedes Paar aus Wagenrücklauf und Zeilenvorschub durch einen einzelnen Zeilenvorschub, oder umgekehrt, und beschädigt dabei überall Bytes. Die PNG-Signatur selbst ist genau dafür entworfen, so etwas zu erkennen, und wenn die Verstümmelung eine gleichbleibende, umkehrbare Ersetzung ist, lässt sich die Umwandlung rückgängig machen und die ursprünglichen Bytes wiederherstellen.

Abschneiden: Die oberen Zeilen kommen zurück

Abschneiden ist die häufigste Art, wie PNGs kaputtgehen: ein Download, der bei 80 Prozent stehen blieb, eine Kopie, die abbrach, als ein Laufwerk abgezogen wurde, eine Datei, die von einem Programm gespeichert wurde, das mitten im Schreiben abstürzte. Der vordere Teil der Datei ist intakt, und das Ende fehlt schlicht, meist einschließlich der IEND-Markierung, weshalb so viele Betrachter bemängeln, die Datei sei unvollständig.

Ein abgeschnittenes PNG: Der Header und der obere Teil der Bilddaten haben überlebt; der Rest des Datenstroms und die Endmarkierung kamen nie an.

Weil das Bild von oben nach unten geschrieben wird, rettet sich ein abgeschnittenes PNG in den oberen Teil des Bildes: echte Pixel, bis zu dem Punkt, an dem die Daten enden. Eine Reparatur schreibt ein gültiges Ende neu, damit ein Decoder die Datei akzeptiert und zeichnet, was überlebt hat. Die Zeilen unterhalb des Schnitts sind nicht beschädigt, sie sind abwesend, deshalb lassen sie sich nicht zurückgeben. Das ist ein ehrliches Teilergebnis, dieselbe Art von Ergebnis, die ein abgeschnittenes JPEG auf der Seite zur Fotoreparatur liefert.

Schaden mitten im Stream: warum die Zeilen darunter verloren sind

Ein Schaden, der mitten in den IDAT-Daten landet statt am Ende, ist der schwierige Fall, und der Grund heißt deflate. Deflate komprimiert das Bild als einen durchgehenden Datenstrom, in dem jeder Teil von dem abhängt, was vor ihm kam. Es hat keine regelmäßigen Markierungen, an denen man sich neu synchronisieren könnte, sobald der Decoder also auf ein beschädigtes Byte trifft, verliert er den Faden und findet ihn nicht wieder. Alles nach dem Schaden decodiert als Rauschen.

In der Praxis heißt das: Ein einziges fehlerhaftes Byte irgendwo weiter unten kann dich jede Zeile darunter kosten, nicht nur eine Zeile. Das Bild ist oberhalb des Treffers sauber und darunter Müll. Eine Reparatur kann die Zeilen, die vor dem Schaden decodiert wurden, immer noch retten, was wirklich etwas wert ist, aber sie kann den Datenstrom jenseits des Bruchs nicht wieder zusammenflicken. Vergleiche das mit Formaten, die einen Index getrennt von ihren Daten speichern: Dort kann der Wiederaufbau des Index die ganze Sache retten. PNG hält seine Pixel in einem einzigen, unteilbaren deflate-Stream, deshalb ist eine Wunde mitten im Stream unterhalb des Schnitts endgültig.

Was sich retten lässt, in einer ehrlichen Liste

Ordne dein kaputtes PNG in eine dieser Kategorien ein, und du kennst die Prognose, bevor du irgendeine Mühe investierst:

  • Prüfsummen-Fehler, Daten intakt. Deterministische Reparatur, kein Verlust. Berechne den CRC neu, und die Datei ist wieder gültig.
  • Auf null gesetzte oder durcheinandergebrachte Abmessungen.In den meisten Fällen eine deterministische Reparatur. Die gespeicherte IHDR-Prüfsumme verrät die ursprüngliche Größe.
  • Verstümmelte Zeilenumbrüche durch die Übertragung.Umkehrbar, wenn die Ersetzung gleichbleibend war. Mach die Umwandlung rückgängig, stell die Bytes wieder her.
  • Abgeschnittene Datei. Teilweise. Der obere Teil des Bildes kommt zurück; das fehlende Ende nicht.
  • IDAT-Beschädigung mitten im Stream. Bestenfalls teilweise. Sauber oberhalb des Schadens, verloren darunter, weil deflate sich nicht neu synchronisieren kann.
  • Null Bytes oder lauter Nullen. Kein Reparaturfall. Es gibt kein Bild in der Datei, das man wiederaufbauen könnte; das ist ein Problem der Datenrettung.

Die PNG-Reparatur steht neben den anderen Format-Tools imVerzeichnis der Reparatur-Tools. In welche Kategorie deine Datei auch fällt, ein gutes Tool sagt dir die Wahrheit darüber, statt dir die grauen Zeilen zurück zu versprechen.

Häufige Fragen

Warum lässt sich mein PNG nicht öffnen?

Meist eines von drei Dingen: Die acht Byte lange Signatur ganz vorne ist beschädigt, sodass Betrachter die Datei überhaupt nicht als PNG erkennen; der Header-Chunk (IHDR), der die Bildabmessungen speichert, ist falsch oder auf null gesetzt, sodass ein Decoder keine Zeichenfläche aufbauen kann; oder die komprimierten Bilddaten wurden mittendrin abgeschnitten oder beschädigt. Die ersten beiden sind oft deterministische Reparaturen, weil PNG für jeden Chunk eine Prüfsumme speichert. Beim dritten beginnen die ehrlichen Grenzen: Bildzeilen, die nicht in der Datei waren, lassen sich nicht zurückholen.

Was bedeutet ein PNG-CRC-Fehler?

Jeder Chunk in einem PNG endet mit einer vier Byte langen CRC-32-Prüfsumme, die über Typ und Daten dieses Chunks berechnet wird. Berechnet ein Decoder die Prüfsumme neu und sie stimmt nicht mit dem gespeicherten Wert überein, meldet er einen CRC-Fehler, was bedeutet, dass sich die Bytes in diesem Chunk seit dem Schreiben der Datei verändert haben. Ist nur die Prüfsumme selbst falsch und die Daten sind intakt, macht ihre Neuberechnung die Datei sofort wieder gültig. Haben sich die Daten verändert, tut der CRC seine Arbeit, indem er dich warnt, und wie gut sich das Bild retten lässt, hängt davon ab, welcher Chunk getroffen wurde.

Lässt sich ein abgeschnittenes PNG wiederherstellen?

Teilweise, und nur der obere Teil. PNG komprimiert sein Bild mit deflate und schreibt die Zeilen von oben nach unten, deshalb decodiert eine abgeschnittene Datei sauber bis zu dem Punkt, an dem die Daten enden, und hört dann auf. Den oberen Teil des Bildes bekommst du als echte Pixel zurück. Die Zeilen unterhalb des Schnitts waren nie in der Datei, deshalb kann kein Tool sie wiederherstellen. Ein repariertes, abgeschnittenes PNG ist ein ehrliches Teilergebnis: dein echtes Bild, so weit nach unten, wie die Bytes reichen.

Warum fehlt der untere Teil meines PNG oder ist verzerrt?

Weil deflate, die von PNG verwendete Kompression, ein durchgehender Datenstrom ist, der sich nach einem Schaden nicht wieder synchronisieren kann. Landet die Beschädigung mitten in den Bilddaten statt am Ende, verliert der Decoder an diesem Byte den Faden, und alles danach decodiert als Rauschen, nicht nur die eine beschädigte Zeile. Deshalb kostet dich ein Schaden mitten im Stream in der Regel jede Zeile unterhalb des Treffers, während ein sauberer Abschnitt am Ende zumindest den oberen Teil intakt lässt.

Ein Foto, das sich mit einer grauen unteren Hälfte öffnet, hat einen nahen Verwandten in der JPEG-Welt: warum die Hälfte deines JPEG grau ist.