PicScrub logoPicScrub
Torna ai formati

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

Signature
IHDR
Metadata
IDAT
IEND
Signature
8 byte
89 50 4E 47 0D 0A 1A 0A
IHDR
25 byte
Intestazione dell'immagine (obbligatoria)
Metadata
100 byte
Chunk tEXt, iTXt ed eXIf
IDAT
Lunghezza variabile
Dati compressi dell'immagine
IEND
12 byte
Marker di fine immagine

Firma PNG e IHDR

Firma PNG
Lunghezza di IHDR (13)
Tipo IHDR
Larghezza (256)
Altezza (256)
Profondità di bit, tipo di colore e altro
OffsetHexASCII
0000
89504E470D0A1A0A0000000D49484452
.PNG........IHDR
0010
00000100000001000802000000000000
.............

Struttura di un chunk

LunghezzaTipoDatiCRC32
4 byte4 byteVariabile4 byte

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.

Formato: keyword + null + testo

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.

Parola chiave XMP: XML:com.adobe.xmp\0

eXIf: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

1

Verificare la firma

Controllare la firma PNG: 89 50 4E 47 0D 0A 1A 0A

2

Analizzare i chunk

Leggere lunghezza e tipo di ogni chunk e verificarne il CRC

3

Filtrare i chunk di metadati

Riconoscere e saltare i chunk tEXt, zTXt, iTXt, eXIf e tIME

4

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)