Der "CRC error" und IDAT-Schäden bei einem PNG

Ein PNG prüft sich selbst: Jeder Chunk endet mit einer CRC-32, sodass das Format seinen eigenen Schaden mit ungewöhnlicher Präzision benennen kann. Genau diese Struktur zieht eine harte Grenze — eine falsche Prüfsumme über guten Daten ist ein verlustfreier Fix, während ein verlorenes Byte im Deflate-Stream von IDAT jede darunterliegende Zeile mitnimmt. Deine Datei in die richtige Schublade einzuordnen, verlangt kein Hochladen an irgendeinen Ort.

Deine Datei verlässt nie dein Gerät — die Reparatur läuft in deinem Browser. 0 Bytes hochgeladen.

Your data is the big block — usually intact. What breaks is the small index. Repair rebuilds it.

Drop a file here or browseTap to choose a file

ZIP · Office · PDF · video · JPG · PNG · RAR/7z · SQLite — repaired right here in your browser. Nothing is uploaded

0 bytes uploadedFree: 3 repairs/day — up to 500 MB video, 100 MB docs & archives, 50 MB photos. Free download. Single repair €5.90. No account required.

Jetzt reparieren

  1. Datei ablegen
  2. Reparatur läuft lokal
  3. Ergebnis herunterladen

Wenn ein Bildbetrachter, pngcheck, libpng oder ImageMagick ein PNG mit einem "CRC error" zurückweist — meist libpng error: IDAT: CRC error —, dann stimmen die Bytes eines Chunks nicht mehr mit der daneben gespeicherten Prüfsumme überein. Die Datei hat sich nach dem Schreiben verändert. Zieh das .png oben hinein, und das Werkzeug analysiert die Chunk-Struktur in deinem Browser, berechnet jede CRC-32 neu, um herauszufinden, welcher Chunk tatsächlich beschädigt ist, und baut eine gültige Datei um das herum auf, was überlebt hat — und sagt dir ehrlich, ob dein Fall der deterministische, verlustfreie Typ oder der partielle Typ ist, ohne dass das Bild jemals dein Gerät verlässt.

Was ein "CRC error" bei einem PNG wirklich ist

Ein PNG beginnt mit einer festen Signatur von 8 Bytes — den Bytes 89 50 4E 47 0D 0A 1A 0A — und alles danach ist eine Kette von Chunks. Jeder Chunk ist gleich aufgebaut: eine Länge von 4 Bytes in Big-Endian (die nur die Daten zählt), ein Typ aus 4 ASCII-Bytes wie IHDR, IDAT oder IEND, die Daten selbst und eine abschließende CRC-32 von 4 Bytes. Diese Prüfsumme wird über Typ und Daten des Chunks berechnet — nicht über seine Länge — mit dem üblichen Polynom nach ISO-3309 / ITU-T V.42 (in gespiegelter Form 0xEDB88320). Ein "CRC error" bedeutet, dass ein Decoder diesen Wert neu berechnet hat und er nicht mit den vier Bytes auf der Festplatte übereinstimmte: der Beweis, dass sich die Bytes des Chunks seit dem Schreiben der Datei verändert haben.

Jedes Werkzeug formuliert es auf seine Weise. pngcheck gibt CRC error in chunk IDAT (computed 12ab34cd, expected 89ef01ab) aus; libpng meldet libpng error: IDAT: CRC error oder das knappere Read Error; ImageMagick lässt die darunterliegende zlib-Schicht als IDAT: invalid distance too far back durchscheinen; ein Browser zeichnet schlicht nichts. Der im Meldungstext genannte Chunk sagt dir, was auf dem Spiel steht. Ein CRC error bei einem Neben-Chunk (ancillary) — tEXt, gAMA, pHYs, sRGB, deren Typ mit einem Kleinbuchstaben beginnt — ist kosmetisch, und das Bild lässt sich weiterhin decodieren. Ein CRC error bei einem kritischen Chunk (den vieren, deren Typ mit einem Großbuchstaben beginnt: IHDR, PLTE, IDAT, IEND) ist das, was die Datei wirklich am Öffnen hindert.

Die drei Chunks, die das Bild tragen, sind IHDR, IDAT und IEND. IHDR ist genau 13 Bytes lang: Breite und Höhe (je 4 Bytes), dann die Bittiefe, der Farbtyp (0 Graustufen, 2 Truecolor, 3 indiziert, 4 Grau+Alpha, 6 RGBA), die Kompressionsmethode, die Filtermethode und die Interlace-Methode. IDAT enthält die komprimierten Pixel und ist häufig auf mehrere aufeinanderfolgende Chunks verteilt, die vor dem Dekomprimieren aneinandergehängt werden müssen. IEND ist ein leerer Marker der Länge null, der besagt, dass die Datei vollständig ist. Das Werkzeug liest diese Struktur lokal, prüft jede CRC und benennt den schuldigen Chunk, bevor es ein einziges Byte verändert.

Der Schaden, den ein PNG exakt rückgängig machen kann

Weil jeder Chunk seine eigene Prüfsumme trägt, hat eine ganze Klasse von PNG-Schäden einen deterministischen Fix — die richtige Antwort ergibt sich aus der Mathematik, sie wird nicht geraten.

Eine falsche CRC über intakten Daten. Der harmloseste Fehler: Die Daten des Chunks sind Byte für Byte korrekt, aber seine gespeicherte CRC-32 ist veraltet — ein häufiges Ergebnis eines Editors, der die Daten neu geschrieben hat, ohne die Prüfsumme zu aktualisieren, oder eines einzelnen gekippten Bits innerhalb des 4-Byte-CRC-Felds selbst. Die CRC aus Typ und Daten neu zu berechnen und zurückzuschreiben macht die Datei wieder gültig, ganz ohne Verlust. Die Prüfsumme war das Einzige, was falsch war.

Auf null gesetzte oder verwürfelte Abmessungen. Wenn die Breite oder Höhe in IHDR beschädigt ist, kann kein Decoder eine Zeichenfläche reservieren, und die Datei öffnet nicht — oft als libpng error: Invalid IHDR data. Aber IHDR speichert seine eigene CRC, berechnet zu einer Zeit, als die Abmessungen noch korrekt waren. Das macht die Wiederherstellung zu einer Suche: Man probiert Kandidatenpaare aus Breite/Höhe durch, berechnet für jedes die CRC-32 des 13-Byte-Chunks neu und hält an, sobald sie mit dem gespeicherten Wert übereinstimmt. Die ursprünglichen Abmessungen fallen unmittelbar aus der Rechnung heraus, exakt, ohne jedes Raten.

Verstümmelung von Zeilenumbrüchen und des höchsten Bits. Die 8-Byte-Signatur wurde als Stolperdraht für Korruption im Textmodus entworfen: Das Paar 0D 0A fängt eine CRLF→LF-Umwandlung ab, das abschließende 0A fängt LF→CRLF ab, und das führende 89 (mit gesetztem höchstem Bit) fängt eine 7-Bit-Übertragung ab, die es entfernt hat. Wenn ein PNG durch einen FTP-Client im ASCII-Modus oder ein Skript geschleust wurde, das es als Text neu geschrieben hat, ist die Ersetzung konsistent und umkehrbar — man macht die Transformation rückgängig, und die ursprünglichen Bytes kehren in der gesamten Datei zurück, nicht nur in der Signatur.

IDAT, Deflate und wo die Wiederherstellung endet

Innerhalb der IDAT-Chunks bilden die Pixel einen einzigen zlib-Datenstrom: einen 2-Byte-Header (üblicherweise 78 9C), einen mit deflate komprimierten Rumpf und eine 4-Byte-Adler-32-Prüfsumme ganz am Ende. Vor der Kompression wird jeder Bildzeile (scanline) ein 1 Byte langer Filtertyp vorangestellt (0 None, 1 Sub, 2 Up, 3 Average, 4 Paeth), der jeden Pixel aus seinen Nachbarn vorhersagt. Die Zeilen werden von oben nach unten geschrieben, und allein diese Tatsache entscheidet, was sich wiederherstellen lässt, sobald die Daten selbst — nicht nur eine Prüfsumme — beschädigt sind.

Abschneidung. Der häufigste Bruch: ein Download, der zu früh abbrach, eine Kopie, die beim Abziehen eines Laufwerks unterbrochen wurde, ein Absturz mitten im Schreiben. Der vordere Teil der Datei ist intakt, und das Ende — meist samt IEND und der Adler-32 — fehlt schlicht, sodass Decoder EOF while reading IDAT oder das incorrect data check von zlib melden. Weil deflate von oben nach unten decodiert, rettet das Werkzeug jede vollständige Bildzeile bis zum Schnitt, schreibt ein frisches, gültiges IEND und übergibt dir ein ehrliches Teilergebnis: deine echten Pixel, so weit nach unten, wie die Bytes reichen.

Korruption mitten im Stream. Wenn der Schaden im Deflate-Rumpf statt am Ende landet, ist die Grenze hart. Deflate ist ein einziger fortlaufender Stream ohne periodische Resync-Marker, sodass inflate den Faden verliert, sobald es auf ein fehlerhaftes Byte trifft — du siehst invalid distance too far back, invalid literal/length code oder invalid block type —, und alles nach dieser Stelle decodiert als Rauschen. Ein einziges beschädigtes Byte auf halber Höhe kann jede darunterliegende Zeile kosten, nicht nur eine einzelne. Das Werkzeug behält die Zeilen, die oberhalb der Wunde sauber decodiert wurden; es kann den Stream darunter nicht wieder zusammennähen, und eine im Zeilensprung (Adam7) gespeicherte Datei verliert zusätzlich die späteren Durchläufe, die den unteren Bildteil geschärft hätten.

Zwei ehrliche Aussichtslosigkeiten. Eine Datei mit 0 Bytes oder lauter Nullen hat kein Bild, das sich wiederherstellen ließe — das ist ein Problem der Datenrettung für den Speicher, keine Reparatur. Und wenn die Daten eines Chunks (nicht bloß seine CRC) überschrieben wurden, kann die Prüfsumme den Schaden belegen, ihn aber nie rückgängig machen. Alles Obige läuft vollständig in deinem Browser-Tab — der Parser ist abhängigkeitsfreies TypeScript —, sodass ein PNG, das vielleicht ein privates Foto, ein Screenshot oder ein gescanntes Dokument ist, nie auf einen Server kopiert wird: Öffne den Netzwerk-Tab (Network) und bestätige, dass 0 Bytes das Gerät verlassen.

Was sich reparieren lässt und was nicht

Kann repariert werden

  • Ein Chunk, dessen gespeicherte CRC-32 nicht mehr zu Typ+Daten passt, während die Bytes intakt sind — neu berechnet und verlustfrei zurückgeschrieben
  • Ein PNG mit auf null gesetzter oder verwürfelter Breite/Höhe in IHDR — die ursprünglichen Abmessungen werden per Brute Force aus der gespeicherten IHDR-CRC zurückgewonnen
  • Dateien, verstümmelt durch die CRLF↔LF-Umwandlung von Zeilenumbrüchen oder das Entfernen des höchsten Bits bei einer Übertragung im Textmodus — die umkehrbare Ersetzung wird rückgängig gemacht
  • Ein abgeschnittenes PNG, dem das Ende und das IEND fehlen — die oberen Bildzeilen, die decodiert werden konnten, werden gerettet und ein gültiges IEND wird geschrieben
  • Zeilen oberhalb eines Treffers mitten in IDAT — alles, was deflate vor dem beschädigten Byte sauber decodiert hat, bleibt erhalten

Kann nicht repariert werden

  • Zeilen unterhalb einer Korruption mitten in IDAT — deflate kann sich nicht resynchronisieren, sodass alles nach dem beschädigten Byte als Rauschen decodiert
  • Bildzeilen jenseits des Schnitts in einer abgeschnittenen Datei — diese Bytes wurden nie auf die Festplatte geschrieben
  • Eine Datei mit 0 Bytes oder lauter Nullen — es gibt kein Bild, das sich wiederherstellen ließe; das ist ein Problem der Datenrettung, keine Reparatur
  • Die exakten Farben eines Chunks, dessen Daten (nicht nur seine CRC) überschrieben wurden — die CRC belegt nur den Schaden, sie kann ihn nicht rückgängig machen
  • Die späteren Zeilensprung-Durchläufe (Adam7) unterhalb eines Bruchs mitten im Stream — das Detail, das sie hinzufügen, ist verloren

Wenn eine Reparatur fehlschlägt, sagen wir dir warum (fehlende Daten gegenüber beschädigter Struktur), und für eine fehlgeschlagene Reparatur wird dir nie etwas berechnet.

Häufige Fragen

Bedeutet ein "CRC error" bei einem PNG, dass mein Bild verloren ist?

Nicht unbedingt. Die CRC-32 jedes Chunks sagt dir nur, dass sich die Bytes dieses Chunks seit dem Schreiben der Datei verändert haben. Ist bloß die Prüfsumme falsch und sind die Daten intakt, behebt ein Neuberechnen die Datei ohne Verlust. Haben sich die Daten selbst verändert, hängt es vom getroffenen Chunk ab, wie viel du zurückbekommst — ein fehlerhafter Neben-Chunk wie tEXt ist kosmetisch, wohingegen ein Schaden innerhalb von IDAT die darunterliegenden Zeilen kosten kann.

Was ist IDAT, und warum kostet ein Schaden dort den unteren Bildteil?

IDAT enthält die komprimierten Pixel als einen einzigen fortlaufenden deflate-Stream, geschrieben von oben nach unten. Deflate hat keine periodischen Marker, an denen es sich resynchronisieren könnte, sodass der Decoder den Faden verliert, sobald er auf ein beschädigtes Byte trifft, und alles danach als Rauschen decodiert. Deshalb kann ein einzelnes fehlerhaftes Byte auf halber Höhe jede darunterliegende Zeile mitnehmen, während eine saubere Abschneidung wenigstens den oberen Teil intakt lässt.

Mein PNG öffnet in einem Programm, zeigt aber in einem anderen einen CRC error — warum?

Viele nachsichtige Bildbetrachter ignorieren CRC-Abweichungen und stellen die Datei trotzdem dar, während strenge Werkzeuge wie pngcheck oder libpng sie zurückweisen. Dass sie irgendwo öffnet, bedeutet meist, dass die Pixeldaten in Ordnung sind und nur die Prüfsumme veraltet ist — der deterministische, verlustfreie Fall. Ein Neuberechnen der CRC erzeugt eine Datei, die jeder strenge Decoder akzeptiert.

Lassen sich auf null gesetzte Bildabmessungen (IHDR) wirklich exakt wiederherstellen?

Ja, in den meisten Fällen. Der IHDR-Chunk trägt eine CRC-32, die berechnet wurde, als Breite und Höhe noch korrekt waren. Die Wiederherstellung probiert Kandidaten-Abmessungen durch, berechnet für jede die CRC des Chunks neu und hält an, sobald sie mit dem gespeicherten Wert übereinstimmt — so wird die ursprüngliche Größe aus der Mathematik abgeleitet und nicht geraten.

Wird mein PNG zum Reparieren hochgeladen?

Nein. Die Datei wird von deiner Festplatte gelesen und in deinem Browser-Tab neu aufgebaut; der Parser ist reines TypeScript, und es wird nichts übertragen. Du kannst den Netzwerk-Tab (Network) öffnen und bestätigen, dass 0 Bytes das Gerät verlassen — was zählt, wenn das PNG ein privates Foto, ein Screenshot von etwas Sensiblem oder ein gescanntes Dokument ist.

Verwandt: Ein JPEG reparieren · Warum ein PNG nicht öffnet: Chunks, CRCs und was sich retten lässt · "Unexpected end of archive" (Deflate-Abschneidung) · Überprüfe, dass nichts hochgeladen wird