Jetzt reparieren
- Datei ablegen
- Reparatur läuft lokal
- Ergebnis herunterladen
Wenn sich ein als .png gespeicherter Screenshot nicht öffnen lässt, ist der Betrachter meist bei etwas streng, das ihm das Format ganz genau zu prüfen erlaubt. Windows Fotos meldet "It looks like we don't support this file format" (dieses Dateiformat wird offenbar nicht unterstützt) oder "This file can't be opened" (diese Datei kann nicht geöffnet werden); die macOS-Vorschau sagt, die Datei sei "may be damaged or use a file format Preview doesn't recognize" (möglicherweise beschädigt oder in einem Format, das die Vorschau nicht erkennt); Tools auf libpng-Basis werfen IDAT: CRC error, IHDR: CRC error oder Not a PNG file. Lege die Datei oben ab, und das Tool geht sie Chunk für Chunk in deinem Browser durch — prüft jedes CRC, kontrolliert die 8-Byte-Signatur und die IHDR-Geometrie und decodiert den DEFLATE-Stream so weit, wie er überlebt — und schreibt dann eine gültige Datei um das herum, was wirklich vorhanden ist. Nichts wird hochgeladen; ein Screenshot zeigt oft einen Kontostand, eine private Nachricht oder ein Patientenportal, und er muss dein Gerät nie verlassen, um geprüft zu werden.
Wie ein PNG-Screenshot aufgebaut ist
Jedes PNG beginnt mit derselben 8-Byte-Signatur — 89 50 4E 47 0D 0A 1A 0A — einem Fingerabdruck, der bewusst mit Stolperdrähten gespickt ist: Das Byte mit gesetztem höchsten Bit 0x89 entlarvt auf 7 Bit beschnittene Kanäle, das 0D 0A und das einzelne 0A fangen eine Zeilenende-Umwandlung ab, und das 1A (DOS-Dateiende) hindert ein unbedachtes type daran, den Rest auszugeben. Danach folgt eine Reihe von Chunks, jeder ein sauberes Paket: eine 4-Byte-Länge in Big-Endian, ein 4-Byte-ASCII-Typ, die Daten und ein 4-Byte-CRC-32, berechnet über Typ und Daten (nie über die Länge) mit dem üblichen reflektierten Polynom 0xEDB88320.
Drei Chunks tragen das Bild. IHDR steht an erster Stelle und ist immer 13 Bytes lang: Breite (u32), Höhe (u32), dann einzelne Bytes für Bittiefe, Farbtyp, Kompressionsverfahren, Filterverfahren und Interlace-Verfahren. Ein Screenshot eines modernen Betriebssystems ist fast immer 8-Bit, nicht interlaced, Farbtyp 2 (Truecolor) oder 6 (Truecolor mit Alpha). IDAT enthält das Bild, mitunter auf mehrere aufeinanderfolgende IDAT-Chunks verteilt; darin steckt ein zlib-Stream (Header-Byte 0x78) aus DEFLATE-komprimierten gefilterten Bildzeilen — jede Zeile mit einem Filter-Byte 0–4 (None, Sub, Up, Average, Paeth) vorangestellt, von oben nach unten geschrieben. IEND ist die leere Endmarkierung mit einem festen CRC von AE 42 60 82.
Screenshots führen außerdem erkennbare Zusatz-Chunks mit sich — der kleingeschriebene erste Buchstabe kennzeichnet sie als optional — etwa pHYs (Pixeldichte, damit eine Retina-Aufnahme ihren Maßstab angibt), iCCP oder sRGB (Farbprofil), tEXt/eXIf (Metadaten, die das Aufnahme-Tool einstempelt). Diese können beschädigt werden oder verlorengehen, ohne dass ein einziger Pixel verloren geht, denn ein Decoder darf jeden Zusatz-Chunk überspringen, den er nicht versteht.
Der Schaden mit sauberer, deterministischer Reparatur
Weil sich jeder Chunk selbst prüft, hat eine ganze Klasse von PNG-Schäden eine berechenbare Antwort statt einer Vermutung:
- Falsche Prüfsumme, richtige Daten. Der häufigste Fehlalarm: Die Bytes eines Chunks sind unversehrt, aber sein gespeichertes CRC passt nicht mehr, sodass strenge Decoder (und
pngcheck) die Datei mitCRC error in chunk IDATablehnen. Das CRC-32 aus den Daten neu zu berechnen und zurückzuschreiben macht die Datei mit null Verlust wieder gültig — die Prüfsumme war das Einzige, das nicht stimmte. - Auf null gesetzte oder verwürfelte Dimensionen. Ist die Breite oder Höhe im IHDR auf null gesetzt, kann kein Decoder eine Leinwand anlegen und die Datei öffnet nicht. Doch IHDR trägt sein eigenes CRC, berechnet zu der Zeit, als die Zahlen noch stimmten. Das erlaubt der Reparatur, die Geometrie per Brute Force zu ermitteln: Kandidatenwerte für Breite/Höhe durchprobieren, für jeden das Chunk-CRC neu berechnen und anhalten, sobald es zum gespeicherten Wert passt. Die ursprünglichen Abmessungen fallen direkt aus der Rechnung — ohne Raten.
- Verstümmelung durch Zeilenumbrüche / Textmodus. Ein Screenshot, der durch einen FTP-Client im ASCII-Modus, eine Chat-Brücke oder ein Skript geschickt wurde, das ihn als Text neu geschrieben hat, ersetzt jedes
0D 0Adurch ein einzelnes0A(oder umgekehrt) und beschädigt so Bytes im gesamten Dokument. Die Signatur ist genau dafür ausgelegt, dies zu erkennen, und wenn die Ersetzung konsistent ist, lässt sie sich Byte für Byte rückgängig machen. - Fehlendes oder defektes IEND. Eine ansonsten vollständige Datei, die ihre abschließende Endmarkierung verloren hat, löst Warnungen wegen "unvollständiger Datei" aus; ein gültiges IEND neu zu schreiben, lässt einen strengen Decoder das Bild akzeptieren, das bereits vollständig da ist.
Der Schaden, der dich Zeilen kostet
Die ehrlichen Grenzen beginnen dort, wo die Pixeldaten selbst weg sind, und Screenshots erwischt es auf beide Arten.
Abschneiden — der obere Teil kommt zurück. Das ist die häufigste Art, wie ein Screenshot kaputtgeht: ein Speichervorgang, der durch eine volle Platte unterbrochen wurde, eine Kopie, die beim Abziehen eines Telefons abbrach, eine Cloud-Synchronisierung, die bei 80 Prozent stehen blieb. Der vordere Teil der Datei ist unversehrt, und das Ende — normalerweise samt IEND — fehlt schlicht. Weil die Bildzeilen von oben nach unten geschrieben werden, lässt sich ein abgeschnittenes PNG in seinen oberen Bildteil retten: echte Pixel bis zu der Stelle, an der die Daten enden. Die Reparatur schreibt einen gültigen Abschluss neu, damit ein Decoder die Datei akzeptiert und das zeichnet, was überlebt hat. Die Zeilen unterhalb des Schnitts sind nicht beschädigt, sie sind nicht vorhanden, also kann kein Tool sie zurückbringen — das Ergebnis ist ein ehrliches Teilbild.
IDAT-Schaden mitten im Stream — der untere Teil ist Rauschen. Landet die Beschädigung innerhalb des DEFLATE-Streams statt am Ende, liegt der Grund für die Unwiederbringlichkeit im DEFLATE selbst: Es ist ein einziger fortlaufender Stream, in dem jeder Teil vom Vorangegangenen abhängt, ohne regelmäßige Markierungen zum Resynchronisieren. Sobald der Decoder auf das fehlerhafte Byte trifft, verliert er den Faden (zlib meldet incorrect data check / invalid distance too far back), und alles danach wird als Rauschen decodiert. Ein einziges gekipptes Byte auf halber Höhe kann dich jede Zeile darunter kosten, nicht nur eine — das Bild ist oberhalb des Treffers sauber und unterhalb Müll. Deshalb öffnet sich ein Screenshot mit scharfem oberen Teil und einer verschmierten oder grauen unteren Hälfte — dieselbe Ergebnisform, die ein abgeschnittenes JPEG liefert.
Vergleiche das mit Formaten, die einen Index getrennt von ihren Daten führen — das moov eines QuickTime-Videos, ein SQLite-B-Baum —, bei denen der Wiederaufbau der Karte die ganze Datei rettet. PNG hält seine Pixel in einem einzigen unteilbaren DEFLATE-Stream, deshalb ist eine Wunde mitten im Stream unterhalb des Schnitts dauerhaft.
Was sich reparieren lässt und was nicht
Kann repariert werden
- Ein Chunk, dessen gespeichertes CRC-32 nicht mehr zu den ansonsten unversehrten Daten passt — das CRC wird neu berechnet und die Datei validiert ohne Verlust
- Auf null gesetzte oder verwürfelte IHDR-Breite/-Höhe, wiederhergestellt durch Brute-Force von Kandidaten gegen das eigene gespeicherte CRC des Chunks
- Verstümmelung durch Zeilenumbrüche / Textmodus (CR-LF ↔ LF) von einer Übertragung im ASCII-Modus oder einem Skript, das die Datei als Text neu geschrieben hat
- Eine fehlende oder fehlerhafte IEND-Endmarkierung bei einer Datei, deren Bilddaten ansonsten vollständig sind
- Ein abgeschnittener Screenshot: Die oberen Zeilen, die tatsächlich geschrieben wurden, decodieren wieder als echte Pixel
Kann nicht repariert werden
- Bildzeilen unterhalb eines IDAT-Treffers mitten im Stream — DEFLATE kann nicht resynchronisieren, also ist alles nach dem beschädigten Byte Rauschen
- Die Zeilen unterhalb des Schnitts in einer abgeschnittenen Datei — diese Pixel wurden nie geschrieben, und kein Tool kann sie erfinden
- Eine Datei, die sich als 0 Bytes oder lauter Nullen liest — es gibt kein Bild zum Wiederaufbau (das ist eine Datenrettung, keine Reparatur)
- Ein Screenshot, den eine andere App nach dem Schaden neu codiert oder neu komprimiert hat — die falschen Pixel sind jetzt eingebrannt
- Die pixelgenaue Wiederherstellung einer verunstalteten unteren Hälfte — die Reparatur liefert ein ehrliches Teilbild, nicht die grauen Zeilen zurück
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.