Formato PNG
Portable Network Graphics
Una struttura fatta di chunk
PNG ha uno dei formati di file più puliti in circolazione. Tutto è organizzato in "chunk", blocchi autonomi con un tipo, dei dati e una somma di controllo. La parte elegante è che i decoder possono saltare i chunk che non capiscono, ed è così che PNG supporta i metadati senza rompere i programmi più vecchi.
L'idea geniale sta nei nomi dei chunk: se la prima lettera è maiuscola, il chunk è "critico" (senza di lui l'immagine non si vede). Minuscola vuol dire "ausiliario", cioè utile ma non indispensabile. Tutti i chunk di metadati che ci interessano sono ausiliari, ed è per questo che possiamo rimuoverli senza rischi.
Struttura di un file PNG
Firma PNG e IHDR
| Offset | Hex | ASCII | |||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0000 | 89504E470D0A1A0A0000000D49484452 | .PNG........IHDR | |||||||||||||||
| 0010 | 00000100000001000802000000000000 | ............. | |||||||||||||||
Struttura di un chunk
Come si leggono i nomi dei chunk
- • Prima lettera maiuscola = chunk critico (va per forza interpretato)
- • Prima lettera minuscola = chunk ausiliario (opzionale, si può ignorare)
- • Seconda lettera = pubblico (maiuscola) o privato (minuscola)
I chunk critici
Questi chunk devono essere presenti e interpretabili perché l'immagine sia valida. PicScrub mantiene sempre i chunk critici.
IHDR:intestazione dell'immagine
Primo chunk dopo la firma. Contiene larghezza, altezza, profondità di bit, tipo di colore, metodo di compressione, metodo di filtro e metodo di interlacciamento. Esattamente 13 byte di dati.
IDAT:dati dell'immagine
Contiene i dati compressi dell'immagine (zlib/deflate). Possono essere divisi tra più chunk IDAT, che devono essere consecutivi.
IEND:fine dell'immagine
Segna la fine del flusso di dati PNG. Deve essere l'ultimo chunk. Non contiene nessun byte di dati.
PLTE:tavolozza
Necessario per le immagini a colori indicizzati (tipo di colore 3). Contiene da 1 a 256 voci RGB della tavolozza.
I chunk di metadati
Chunk ausiliari che possono contenere metadati sensibili per la privacy. Sono quelli che PicScrub rimuove.
tEXt:testo non compresso
Coppie chiave-valore codificate in Latin-1. Chiavi tipiche: Author, Description, Copyright, Creation Time, Software.
zTXt:testo compresso
Come tEXt, ma con compressione zlib. Si usa per contenuti di testo più lunghi.
iTXt:testo internazionale
Testo UTF-8 con compressione opzionale. Supporta i tag di lingua e le parole chiave tradotte. Si usa per i metadati XMP.
XML:com.adobe.xmp\0eXIf:dati EXIF
Registrato come estensione PNG nel 2017. Contiene dati EXIF grezzi in formato TIFF, con la stessa struttura dell'EXIF nei JPEG. Può contenere GPS, data e ora e dati del dispositivo.
iCCP:profilo colore ICC
Profilo colore ICC incorporato, compresso con zlib. PicScrub lo mantiene di default per non alterare i colori.
tIME:data dell'ultima modifica
Sette byte: anno (2), mese, giorno, ora, minuto, secondo. Rivela quando l'immagine è stata modificata l'ultima volta.
I chunk legati al colore
Questi chunk influiscono su come vengono resi i colori, ma in genere non contengono informazioni personali. PicScrub li mantiene di default.
sRGB
Indica lo spazio colore sRGB. Un solo byte per l'intento di resa.
gAMA
Valore di gamma come intero senza segno da 4 byte (moltiplicato per 100.000).
cHRM
Cromaticità dei primari e coordinate del punto di bianco.
sBIT
Profondità di bit originali dei campioni per ogni canale.
La verifica CRC32
Ogni chunk PNG include una somma di controllo CRC32 calcolata sul tipo e sui dati del chunk. Serve a garantire l'integrità dei dati.
Come si calcola il CRC
Input CRC32 = chunk_type (4 byte) + chunk_data (N byte) Output CRC32 = 4 byte aggiunti dopo i dati del chunk // PNG usa il polinomio CRC-32: 0xEDB88320
Perché PicScrub verifica il CRC
Quando legge un file PNG, PicScrub verifica il CRC di ogni chunk per controllare l'integrità dei dati. I chunk danneggiati vengono gestiti senza far saltare tutto.
Come PicScrub elabora i PNG
Verificare la firma
Controllare la firma PNG: 89 50 4E 47 0D 0A 1A 0A
Analizzare i chunk
Leggere lunghezza e tipo di ogni chunk e verificarne il CRC
Filtrare i chunk di metadati
Riconoscere e saltare i chunk tEXt, zTXt, iTXt, eXIf e tIME
Ricostruire il file
Scrivere firma + chunk filtrati + IEND
Chunk mantenuti
- • IHDR, PLTE, IDAT, IEND (critici)
- • sRGB, gAMA, cHRM (colore)
- • iCCP (profilo colore, opzionale)
- • pHYs (dimensioni dei pixel)
- • tRNS (trasparenza)
Chunk rimossi
- • tEXt (metadati testuali)
- • zTXt (testo compresso)
- • iTXt (testo internazionale, XMP)
- • eXIf (dati EXIF)
- • tIME (data di modifica)