Ripara ora
- Trascina il file
- La riparazione avviene in locale
- Scarica il risultato
Quando uno screenshot salvato come .png non si apre, il visualizzatore è di solito severo su qualcosa che il formato gli permette di verificare con esattezza. Foto di Windows dice "It looks like we don't support this file format" (sembra che non supportiamo questo formato) oppure "This file can't be opened" (impossibile aprire questo file); Anteprima di macOS dice che il file "potrebbe essere danneggiato o usare un formato che Anteprima non riconosce"; gli strumenti basati su libpng lanciano IDAT: CRC error, IHDR: CRC error o Not a PNG file. Trascina il file qui sopra e lo strumento lo percorre chunk per chunk nel tuo browser — verificando ogni CRC, controllando la firma di 8 byte e la geometria di IHDR, e decodificando il flusso DEFLATE fin dove sopravvive — e poi riscrive un file valido attorno a ciò che c'è davvero. Non viene caricato nulla; uno screenshot mostra spesso un saldo bancario, un messaggio privato o un portale medico, e non deve mai lasciare il tuo dispositivo per essere controllato.
Come è costruito uno screenshot PNG
Ogni PNG si apre con la stessa firma di 8 byte —89 50 4E 47 0D 0A 1A 0A—, un'impronta deliberatamente carica di trappole: il byte con il bit alto 0x89 intercetta i canali a soli 7 bit, il 0D 0A e l'0A isolato intercettano la conversione di fine riga, e l'1A (fine file di DOS) ferma un type distratto prima che riversi il resto. Dopo viene una serie di chunk, ognuno un pacchetto ordinato: una lunghezza di 4 byte big-endian, un tipo ASCII di 4 byte, i dati e un CRC-32 di 4 byte calcolato sul tipo e sui dati (mai sulla lunghezza) con il polinomio riflesso standard 0xEDB88320.
Tre chunk trasportano l'immagine. IHDR viene per primo e occupa sempre 13 byte: larghezza (u32), altezza (u32), poi byte singoli per la profondità di bit, il tipo di colore, il metodo di compressione, il metodo di filtro e il metodo di interlacciamento. Lo screenshot di un sistema operativo moderno è quasi sempre a 8 bit, non interlacciato, con tipo di colore 2 (colore reale) o 6 (colore reale con alfa). IDAT contiene l'immagine, a volte suddivisa in più chunk IDAT consecutivi; al suo interno c'è un flusso zlib (byte di intestazione 0x78) di linee di scansione filtrate compresse con DEFLATE — ogni riga preceduta da un byte di filtro 0–4 (None, Sub, Up, Average, Paeth), scritte dall'alto verso il basso. IEND è il marcatore di fine vuoto, con un CRC fisso di AE 42 60 82.
Gli screenshot portano anche chunk ausiliari riconoscibili —la prima lettera minuscola li marca come opzionali— come pHYs (densità di pixel, così una cattura Retina indica la sua scala), iCCP o sRGB (profilo colore), tEXt/eXIf (metadati che lo strumento di cattura imprime). Questi possono danneggiarsi o andare persi senza perdere un solo pixel, perché a un decodificatore è consentito saltare qualsiasi chunk ausiliario che non comprende.
Il danno che ha una correzione pulita e deterministica
Poiché ogni chunk si autoverifica, un'intera classe di danni del PNG ha una risposta conoscibile invece di una congettura:
- Somma errata, dati corretti. Il falso allarme più comune: i byte di un chunk sono intatti ma il suo CRC memorizzato non coincide più, così i decodificatori severi (e
pngcheck) rifiutano il file conCRC error in chunk IDAT. Ricalcolare il CRC-32 a partire dai dati e riscriverlo rende di nuovo valido il file con zero perdite: la somma di controllo era l'unica cosa sbagliata. - Dimensioni azzerate o alterate. Se la larghezza o l'altezza di IHDR è azzerata, nessun decodificatore può allocare una tela e il file non si apre. Ma IHDR porta il proprio CRC, calcolato quando i numeri erano corretti. Questo permette alla riparazione di forzare la geometria a forza bruta: provare valori candidati di larghezza/altezza, ricalcolare il CRC del chunk per ciascuno e fermarsi quando coincide con il valore memorizzato. Le dimensioni originali escono direttamente dall'aritmetica — senza indovinare.
- Corruzione da fine riga / modalità testo. Uno screenshot passato attraverso un client FTP in modalità ASCII, un ponte di chat o uno script che l'ha riscritto come testo cambia ogni
0D 0Ain un0Aisolato (o viceversa), corrompendo byte in tutto il file. La firma è progettata per rilevare esattamente questo, e quando la sostituzione è coerente si può invertire byte per byte. - IEND assente o rotto. Un file per il resto completo ma che ha perso il suo marcatore di fine fa scattare avvisi di "file incompleto"; riscrivere un IEND valido permette a un decodificatore severo di accettare l'immagine che è già tutta lì.
Il danno che ti costa righe
I limiti onesti iniziano dove i dati dei pixel stessi non ci sono più, e gli screenshot cadono in entrambi i casi.
Troncamento: la parte superiore torna. È il modo più comune in cui uno screenshot si rompe: un salvataggio interrotto da un disco pieno, una copia tagliata quando un telefono viene scollegato, una sincronizzazione cloud che si è fermata all'80 per cento. La parte anteriore del file è intatta e la coda —di solito incluso IEND— è semplicemente assente. Poiché le linee di scansione sono scritte dall'alto verso il basso, un PNG troncato si recupera nella parte superiore dell'immagine: pixel reali fino a dove finiscono i dati. La riparazione riscrive una chiusura valida affinché un decodificatore accetti il file e disegni ciò che è sopravvissuto. Le righe sotto il taglio non sono danneggiate, sono assenti, quindi nessuno strumento può restituirle: il risultato è un parziale onesto.
Danno a metà di IDAT: la parte inferiore è rumore. Quando la corruzione cade dentro il flusso DEFLATE invece che alla fine, la ragione per cui è irrecuperabile è lo stesso DEFLATE: è un unico flusso continuo in cui ogni parte dipende da ciò che l'ha preceduta, senza marcatori periodici su cui risincronizzarsi. Non appena il decodificatore incontra il byte danneggiato perde il filo (zlib segnala incorrect data check / invalid distance too far back), e tutto ciò che viene dopo si decodifica come rumore. Un solo byte alterato a metà altezza può costare ogni riga sottostante, non solo una linea: l'immagine è pulita sopra il colpo ed è spazzatura sotto. Ecco perché uno screenshot si apre con una parte superiore nitida e una metà inferiore sbavata o grigia, la stessa forma di risultato che dà un JPEG troncato.
Confrontalo con i formati che tengono un indice separato dai loro dati —l'atomo moov di un video QuickTime, un b-tree di SQLite—, dove ricostruire la mappa recupera l'intero file. Il PNG conserva i suoi pixel in un unico flusso DEFLATE indivisibile, quindi una ferita a metà altezza è permanente sotto il taglio.
Cosa può e cosa non può riparare
Può riparare
- Un chunk il cui CRC-32 memorizzato non coincide più con dati per il resto intatti: il CRC viene ricalcolato e il file valida con zero perdite
- Larghezza/altezza di IHDR azzerate o alterate, recuperate forzando i candidati a forza bruta contro il CRC memorizzato dello stesso chunk
- Corruzione da fine riga / modalità testo (CR-LF ↔ LF) da un trasferimento in modalità ASCII o da uno script che ha riscritto il file come testo
- Un marcatore di fine IEND assente o malformato in un file i cui dati immagine sono per il resto completi
- Uno screenshot troncato: le righe superiori che sono state effettivamente scritte si decodificano di nuovo come pixel reali
Non può riparare
- Le righe dell'immagine sotto un colpo a metà di IDAT: DEFLATE non può risincronizzarsi, quindi tutto ciò che segue il byte danneggiato è rumore
- Le righe sotto il taglio in un file troncato: quei pixel non sono mai stati scritti e nessuno strumento può inventarli
- Un file che si legge come 0 byte o tutti zeri: non c'è alcuna immagine da ricostruire (quello è un lavoro di recupero dati, non una riparazione)
- Uno screenshot che un'altra app ha ricodificato o ricompresso dopo il danno: i pixel sbagliati sono ormai incisi dentro
- Il ripristino pixel per pixel di una metà inferiore corrotta: la riparazione restituisce un parziale onesto, non le righe grigie
Se una riparazione fallisce, ti diciamo perché (dati mancanti rispetto a struttura danneggiata), e non ti viene mai addebitato nulla per una riparazione fallita.