Il formato PNG ha il supporto per metadati più o meno arbitrari. Lo standard PNG definisce un file PNG, essenzialmente una serie di blocchi, alcuni dei quali sono richiesti (e contengono i dati dell'immagine). Altri, tuttavia, sono opzionali. Ad esempio, esiste un blocco per la memorizzazione delle informazioni gamma o dei dati dell'istogramma.
In particolare, esiste un tEXt
blocco che può essere utilizzato per memorizzare coppie di testo chiave / valore arbitrarie. Questo può essere usato per spedire qualsiasi tipo di dato arbitrario che desideri, a condizione che tu possa rappresentarlo come testo (che è abbastanza probabile).
Avrai bisogno di una libreria PNG che ti consenta di accedere e manipolare questi blocchi aggiuntivi (come la libreria di riferimento ), oppure dovrai scriverne uno tu stesso. Quindi si tratta solo di scegliere come codificare i dati desiderati come coppie chiave / valore. Suggerirei quanto segue:
- scegli i nomi chiave che sono preceduti dal nome del tuo progetto o dal nome in codice come un modo per creare un sistema "namespace" grezzo ed evita potenziali conflitti con gli usi dei dati di altre applicazioni
- non tentare di memorizzare trame reali in questo modo, memorizzare riferimenti a quelle trame che puntano all'interno del database delle risorse del gioco
- dati come dimensioni di creature o oggetti, peso, eccetera - semplici scalari, in sostanza - possono essere archiviati banalmente
Nell'interesse di dare una risposta più completa, farò anche notare che esiste un altro approccio (precedentemente documentato dalle risposte di @Vaughn e @ Alexis): codificare i dati aggiuntivi desiderati direttamente nei pixel dell'immagine, distribuendo i dati attraverso i bit di ordine inferiore dei canali di colore. Questo approccio non richiede l'uso di metadati extra, il che significa che è possibile implementarlo interamente senza fare affidamento su di esso o preoccuparsi di programmi esterni che gestiscono in modo errato quei metadati. Ha anche un fattore "cool" molto alto, e poiché usi solo bit di basso ordine, l'immagine apparirà comunque corretta per l'occhio umano. Tuttavia, ciò significa che la dimensione dell'immagine è un fattore di controllo primario per la quantità di dati che è possibile memorizzare; se hai bisogno di più spazio di archiviazione, devi assegnare più pixel all'immagine.
Come altri hanno sottolineato, questo processo è noto come steganografia .