Guide

Il PNG non si apre: chunk, CRC e cosa è recuperabile

Un PNG è insolitamente onesto sul proprio danno. Ogni blocco al suo interno porta con sé una checksum, così il formato spesso può dirti esattamente cosa è andato storto e, a volte, esattamente come annullarlo. Quella stessa struttura traccia anche una linea netta: alcune rotture hanno una correzione pulita e deterministica, mentre altre si portano via per sempre la parte inferiore della tua immagine.

Com'è messo insieme un PNG

Un PNG si apre con una firma di otto byte, un'impronta fissa che permette a qualsiasi programma di confermare che il file è davvero un PNG. Tutto ciò che viene dopo è una serie dichunk, e ogni chunk è un piccolo pacchetto ordinato: una lunghezza, un tipo di quattro lettere, i dati veri e propri e una checksum di quattro byte.

Tre tipi di chunk portano l'intera immagine. IHDR viene per primo e memorizza l'essenziale: larghezza, altezza, profondità di bit e tipo di colore. IDAT contiene i dati dell'immagine compressi, a volte suddivisi in diversi chunk IDAT di fila.IEND è un minuscolo marcatore di fine che indica che il file è completo. All'interno dei chunk IDAT, i pixel sono compressi con deflate, lo stesso algoritmo usato da ZIP, un unico flusso continuo dalla riga superiore dell'immagine fino a quella inferiore.

Un PNG, dall'inizio alla fine: una firma, un'intestazione con le dimensioni, i dati dell'immagine compressi e un marcatore di fine.

Il dettaglio che rende speciale il PNG è la checksum su ogni chunk. È un CRC-32, calcolato sul tipo e sui dati del chunk, e trasforma il formato in qualcosa che verifica costantemente sé stesso. Ecco perché un PNG può indicare il proprio danno con una precisione che la maggior parte dei formati non riesce a raggiungere.

Il danno che un PNG riesce a scrollarsi di dosso

Poiché ogni chunk si controlla e si descrive da solo, un'intera categoria di danni del PNG ha una correzione pulita e deterministica: la risposta corretta si può conoscere, non indovinare.

Checksum sbagliata, dati giusti

Il caso più benevolo: i dati di un chunk sono a posto ma il suo CRC memorizzato non corrisponde più, così i decoder rigorosi rifiutano il file. Ricalcolare il CRC dai dati e riscriverlo rende di nuovo valido il file senza alcuna perdita. La checksum era l'unica cosa sbagliata.

Dimensioni azzerate o errate

Se la larghezza o l'altezza nell'IHDR vengono azzerate o alterate, nessun decoder riesce a predisporre una tela e il file non si apre. Ma l'IHDR porta con sé il proprio CRC, calcolato all'epoca in cui le dimensioni erano corrette. Questo permette a uno strumento di riparazione di trovare la risposta per forza bruta: provare valori candidati di larghezza e altezza, ricalcolare la checksum per ciascuno e fermarsi quando corrisponde al CRC memorizzato. Le dimensioni originali escono direttamente dai calcoli, senza nessuna congettura.

Ritorni a capo rovinati nel trasferimento

Un classico: un PNG inviato attraverso un sistema che converte i fine riga «per aiutarti», un vecchio client FTP in modalità testo, o uno script che ha riscritto il file come testo. Sostituisce ogni coppia di ritorno di carrello e avanzamento di riga con un solo avanzamento di riga, o viceversa, corrompendo byte ovunque. La firma stessa del PNG è progettata per cogliere esattamente questo, e quando il pasticcio è una sostituzione coerente e reversibile, la trasformazione può essere annullata e i byte originali ripristinati.

Troncamento: le righe in alto tornano

Il troncamento è il modo più comune in cui si rompono i PNG: un download fermatosi all'80 percento, una copia interrotta quando è stata rimossa un'unità, un file salvato da un programma andato in crash a metà scrittura. La parte iniziale del file è intatta e la coda semplicemente manca, di solito compreso il marcatore IEND, ed ecco perché così tanti visualizzatori si lamentano che il file è incompleto.

Un PNG troncato: l'intestazione e la parte superiore dei dati dell'immagine sono sopravvissute; il resto del flusso e il marcatore di fine non sono mai arrivati.

Poiché l'immagine è scritta dall'alto verso il basso, un PNG troncato si recupera nella parte superiore della foto: pixel reali, fino al punto in cui i dati finiscono. Una riparazione riscrive una fine valida così che un decoder accetti il file e disegni ciò che è sopravvissuto. Le righe sotto il taglio non sono danneggiate, sono assenti, quindi non possono essere restituite. Questo è un parziale onesto, lo stesso tipo di risultato che dà un JPEG troncato sul lato della riparazione delle foto.

Danno a metà del flusso: perché le righe sotto spariscono

Il danno che cade nel mezzo dei dati IDAT, anziché alla fine, è il caso difficile, e la ragione è deflate. Deflate comprime l'immagine come un unico flusso continuo in cui ogni parte dipende da ciò che è venuto prima. Non ha marcatori periodici su cui risincronizzarsi, così non appena il decoder incontra un byte corrotto, perde il filo e non riesce a recuperarlo. Tutto ciò che segue il danno si decodifica come rumore.

In pratica questo significa che un singolo byte difettoso a metà altezza può costarti ogni riga sottostante, non solo una linea. L'immagine è pulita sopra il punto colpito e spazzatura sotto. Una riparazione può comunque recuperare le righe che si sono decodificate prima del danno, cosa che vale davvero la pena avere, ma non può ricucire il flusso oltre la rottura. Confrontalo con i formati che memorizzano un indice separatamente dai loro dati: lì, ricostruire l'indice può salvare tutto. Il PNG tiene i suoi pixel in un unico flusso deflate indivisibile, così una ferita a metà del flusso è permanente sotto il taglio.

Cosa è recuperabile, in un unico elenco onesto

Classifica il tuo PNG rotto in una di queste categorie e conoscerai la prognosi prima di spendere qualsiasi sforzo:

  • Checksum che non corrisponde, dati intatti. Correzione deterministica, nessuna perdita. Ricalcola il CRC e il file è di nuovo valido.
  • Dimensioni azzerate o alterate. Correzione deterministica nella maggior parte dei casi. La checksum memorizzata dell'IHDR rivela la dimensione originale.
  • Rovina dei ritorni a capo dovuta al trasferimento.Reversibile quando la sostituzione è stata coerente. Annulla la trasformazione, ripristina i byte.
  • File troncato. Parziale. La parte superiore dell'immagine torna; la coda mancante no.
  • Corruzione dell'IDAT a metà del flusso. Parziale nel migliore dei casi. Pulita sopra il danno, persa sotto, perché deflate non può risincronizzarsi.
  • Zero byte o tutti zeri. Non è un caso di riparazione. Non c'è nessuna immagine nel file da ricostruire; quello è un problema di recupero.

La riparazione dei PNG si affianca agli strumenti per gli altri formati nell'indice degli strumenti di riparazione. In qualunque categoria finisca il tuo file, un buon strumento ti dice la verità su di esso invece di prometterti il ritorno delle righe grigie.

Domande frequenti

Perché il mio PNG non si apre?

Di solito una di tre cose: la firma di otto byte proprio all'inizio è danneggiata, così i visualizzatori non riconoscono affatto il file come un PNG; il chunk di intestazione (IHDR) che memorizza le dimensioni dell'immagine è errato o azzerato, così un decoder non riesce a predisporre una tela; oppure i dati dell'immagine compressi sono stati troncati o corrotti a metà strada. I primi due sono spesso correzioni deterministiche perché il PNG memorizza una checksum per ogni chunk. Il terzo è dove iniziano i limiti onesti: le righe dell'immagine che non erano nel file non possono essere recuperate.

Cosa significa un errore CRC in un PNG?

Ogni chunk in un PNG termina con una checksum CRC-32 di quattro byte calcolata sul tipo e sui dati di quel chunk. Quando un decoder ricalcola la checksum e questa non corrisponde al valore memorizzato, segnala un errore CRC, il che significa che i byte in quel chunk sono cambiati da quando il file è stato scritto. Se l'unica cosa sbagliata è la checksum stessa e i dati sono a posto, ricalcolarla ripara il file del tutto. Se i dati sono cambiati, il CRC sta facendo il suo lavoro avvisandoti, e quanto sia recuperabile l'immagine dipende da quale chunk è stato colpito.

Si può recuperare un PNG troncato?

Parzialmente, e solo la parte superiore. Il PNG comprime la sua immagine con deflate e scrive le righe dall'alto verso il basso, così un file tagliato troppo presto si decodifica in modo pulito fino al punto in cui i dati finiscono, poi si ferma. Recuperi la porzione superiore dell'immagine come pixel reali. Le righe sotto il taglio non erano mai nel file, quindi nessuno strumento può ripristinarle. Un PNG troncato riparato è un parziale onesto: la tua immagine reale, fin dove arrivano i byte.

Perché la parte inferiore del mio PNG manca o è illeggibile?

Perché deflate, la compressione che usa il PNG, è un flusso continuo senza modo di risincronizzarsi dopo un danno. Se la corruzione cade nel mezzo dei dati dell'immagine anziché alla fine, il decoder perde il filo in corrispondenza di quel byte e tutto ciò che segue si decodifica come rumore, non solo la singola riga danneggiata. Ecco perché il danno a metà del flusso di solito ti costa ogni riga sotto il punto colpito, mentre un troncamento pulito lascia almeno intatta la parte superiore.

Una foto che si apre con la metà inferiore in grigio ha un parente stretto nel mondo JPEG: perché metà del tuo JPEG è grigia.