Struttura e gestione del file di tipo PNM

Da Gambas-it.org - Wikipedia.

Introduzione

Il formato PNM (acronimo di "Portable Any Map") è la denominazione generica che raggruppa tre tipi di formati di file immagine specifici: PBM, PGM e PPM. Può risultare molto comodo ed utile, se si vuole creare e gestire in Gambas un file immagine partendo da dati grezzi.

Esso si compone sostanzialmente di due blocchi:

  • una breve intestazione, nella quale è presente:
    1. il numero magico che individua il formato specifico della famiglia PNM;
    2. l'indicazione del numero delle colonne e del numero delle righe che costituiscono l'immagine;
    3. un valore che definisce la profondità {1} del colore;
  • il corpo dei dati grezzi afferenti all'immagine.

Riguardo ai valori delle colonne e delle righe, che compongono l'immagine, va detto che:

  • il prodotto di tali valori, presenti nel file immagine PNM, non deve essere superiore alla dimensione dei dati grezzi dell'immagine, altrimenti si è riscontrato che Gambas non carica in PictureBox l'immagine. Se, infatti, si modifica in "aumento" uno o entrambi i valori, delle colonne o delle righe, rispetto a quanto dovrebbe essere (ossia rispetto alla quantità di dati grezzi costituenti l'immagine), Gambas non carica nella PictureBox una immagine contenente quell'alterazione. In particolare:
  1. per la modalità "Colore", il prodotto dei valori, indicati nell'header del file .pnm, delle Colonne e delle Righe moltiplicato a sua volta per 3 {2} non deve essere superiore al numero di dati grezzi derivanti dalla scannerizzazione;
  2. per la modalità "Scala di Grigi", il prodotto dei valori, indicati nell'header del file .pnm, delle Colonne e delle Righe non deve essere superiore al numero di dati grezzi derivanti dalla scannerizzazione;
  3. per la modalità "Bianco e Nero", il prodotto dei valori, indicati nell'header del file .pnm, delle Colonne e delle Righe diviso a sua volta per 8 {3} non deve essere superiore al numero di dati grezzi derivanti dalla scannerizzazione.
  • la suddetta alterazione del numero, che rappresenta le colonne, o del numero, che rappresenta le righe, costituenti l'immagine può essere in "diminuzione", ma l'immagine ne risulterà alterata.
  • il valore massimo assegnabile al numero delle colonne ed al numero delle righe per ciascuno è 32767.

E' possibile inserire all'interno del file dei caratteri aggiuntivi, che restano estranei alla composizione dell'immagine, e che possono avere una funzione accessoria di commento, come offrire informazioni afferenti al file medesimo, a chi l'ha prodotto, al programma che l'ha generato, alla data o a qualsiasi altro contenuto di testo. Tale tipo di testo è individuato dal segno #, che lo precede. Così, eventuali caratteri dopo il segno #, fino al successivo codice di Salto di riga (in esadecimale: 0A), vengono ignorati ai fini della definizione dell'immagine.
Tali caratteri possono essere posti ovunque nel file, fatta eccezione che:

  • all'inizio prima del primo byte del file, ossia del numero magico, ed immediatamente dopo il valore relativo alla profondità del colore;
  • all'interno dei dati grezzi dell'immagine (altrimenti saranno considerati parte di tali dati).

A chiusura di tali dati di testo verrà posto il carattere indicante il Salto di riga (in esadecimale: 0A). Se tali caratteri aggiuntivi vengono posti alla fine del del file, è possibile omettere il codice 0A come ultimo byte di chiusura.


Composizione del blocco di intestazione (header)

Come già detto nel paragrafo precedente, il blocco d'intestazione si pone - ovviamente - all'inizio del file, ed è costituito da pochi byte essenziali.

Esso è così composto in particolare:

  • numero magico, che può essere:
  1. P4 per le immagini in Bianco e Nero;
  2. P5 per le immagini a Scala di Grigi;
  3. P6 per le immagini a colori.
  • uno spazio;
  • numero delle colonne;
  • uno spazio;
  • numero delle righe;
  • uno spazio;
  • valore della profondità {1} di colore (solo per le immagini a Colori ed in Scala di Grigi !);
  • Salto di riga a chiusura dell'header.

Pertanto, ad esempio, il codice esadecimale del blocco di intestazione relativo ad un file immagine a Scala di Grigi sarà il seguente:

50 35 20 36 32 38 20 38 38 35 20 32 35 35 0A
P 5 6 2 8 8 8 5 2 5 5 .
Num. mag. Spazio Col- -lon- -ne Spazio Ri- - -ghe Spazio Profon- -di- -tà Salto di riga


Disposizione dei dati rispetto all'immagine

Immediatamente dopo il blocco di intestazione cominciano i dati grezzi attinenti all'immagine. L'andamento dei dati grezzi nel file corrisponde ad un andamento dei pixel nell'immagine da sinistra verso destra e dall'alto verso il basso. Il file non prevede, né contiene codice di fine o di inizio riga dei pixel.
Pertanto, ad esempio, il primo dato grezzo in un file immagine in Scala di Grigi corrisponderà al primo pixel in alto a sinistra dell'immagine. L'ultimo byte, invece, corrispoderà all'ultimo pixel in basso verso destra dell'immagine.


I formati della famiglia PNM in particolare

Come si è già detto alla famiglia del formato PNM appartengono i file con estensione: PBM, PGM e PPM.
Essi si distinguono semplicemente dal fatto che corrispondono rispettivamente a file immagini: in "Bianco e Nero", in "Scala di Grigi" e a "Colori".


Il formato PBM

Il formato PBM rappresenta le immagini monocromo a due dimensioni di colore, ossia il Bianco e Nero.

Ogni byte dei dati grezzi, che formano l'immagine, dà con la disposizione dei propri bit, che compongono il relativo valore binario, la disposizione dei pixel bianchi e dei pixel neri nell'immagine. Pertanto ogni byte dà l'indicazione per la disposizione dei due predetti livelli di colore secondo la disposizione degli otto bit che lo compongono e definiscono. Ogni byte, essendo uguale a 8 pixel, può rappresentare una Colonna o Riga dell'immagine formata da 8 pixel.

Esempio pratico

Volendo dunque ottenere questo risultato (ovviamente qui mostrato molto ingrandito):


notiamo che la suddetta disposizione alternata dei pixel bianchi e dei pixel neri corrisponde esattamente alla rappresentazione binaria del numero esadecomale 55, ossia: 0 1 0 1 0 1 0 1. Ciò vorrà dire che nei dati grezzi dovremo porre appunto un byte con valore 55.

Il blocco di intestazione di un file di formatp PBM è così costituito:

  • P4, cioè il numero magico;
  • uno spazio;
  • numero delle colonne;
  • uno spazio;
  • numero delle righe;
  • Salto di riga a chiusura dell'header.

Immediatamente dopo il blocco di intestazione cominciano i dati grezzi dell'immagine, ricordando che 1 pixel = 1 bit, e pertanto 1 byte = 8 pixel.

Scriviamo praticamente il codice esadecimale della righetta in bianco e nero, sopra mostrata. Teniamo a mente che essa è formata da 1 riga con 8 colonne (8 pixel) in Bianco e Nero, dunque basterà 1 byte:

50 34 20 38 20 31 0A 55

che va interpretata così:

50 P
34 4
20 spazio
38 8 colonne (gli 8 pixel/bit)
20 spazio
31 1 riga
0A Salto di riga (chiude l'header)
55 il dato grezzo dell'immagine

Salveremo il nostro codice con estensione .pnm .


Il formato PGM

Il formato PGM rappresenta le immagini in Scala di Grigi.

Ogni byte dei dati grezzi rappresenta 1 pixel dell'immagine. Il suo valore, ponendo la profondità a 255, può variare da 00 (nero) via via con le sfumature di grigio sino a FF (Bianco). Pertanto, in tal caso si potrà impostare per ciascun pixel una delle 256 (da 0 a 255) sfumature del grigio, appunto dal nero sino al bianco.

Il blocco di intestazione di un file di formatp PGM è così costituito:

  • P5, cioè il numero magico;
  • uno spazio;
  • numero delle colonne;
  • uno spazio;
  • numero delle righe;
  • uno spazio;
  • il valore della profondità {1} del grigio;
  • Salto di riga a chiusura dell'header.

Immediatamente dopo il blocco di intestazione cominciano i dati grezzi dell'immagine.

Esempio pratico

Facciamo un semplice esempio pratico di codice esadecimale, per definire soli tre pixel: uno nero; uno grigio di sfumatura esattamente intermedia fra il nero ed il bianco; uno bianco.
Per definire queste tre sfumature del grigio {4} avremo bisogno di tre byte {5}:

50 35 20 33 20 31 20 32 35 35 0A 00 7F FF

che va interpretata così:

50 P
35 5
20 spazio
33 3 colonne (i 3 pixel)
20 spazio
31 1 riga
20 spazio
32 35 35 profondità di 255 sfumature di grigio
0A Salto di riga (chiude l'header)
00 il dato grezzo del pixel nero
7F il dato grezzo del pixel grigio con sfumatura a metà fra il nero ed il bianco
FF il dato grezzo del pixel bianco

Salveremo il nostro codice con estensione .pnm .

Poniamo il caso di vole aggiungere anche un testo di commento alla fine del file. Inseriremo il testo: questa e' una prova !

50 35 20 33 20 31 20 32 35 35 0A 00 7F FF 0A23 71 75 65 73 74 61 20 65 27 20 75 6E 61 20 70 72 6F 76 61 20 21

laddove il primo byte (il numero esadecimale 23), che apre la parte afferente al testo, è appunto il simbolo # .


Il formato PPM

Il formato PPM rappresenta le immagini a Colori.

In questo formato per definire il colore di 1 pixel saranno necessari ben 3 byte dei dati grezzi.

Il blocco di intestazione di un file di formatp PPM è così costituito:

  • P6, cioè il numero magico;
  • uno spazio;
  • numero delle colonne;
  • uno spazio;
  • numero delle righe;
  • uno spazio;
  • il valore della profondità di colore;
  • Salto di riga a chiusura dell'header.

La profondità di colore, ovvero il valore massimo di colore (Maxval) deve essere minore di 65536 e maggiore di zero.

Immediatamente dopo il blocco di intestazione cominciano i dati grezzi dell'immagine.

Esempio pratico

Vediamo come impostare il codice esadecimale di un file immagine in formato PPM che dovrà mostrare semplicemente tre pixel: uno rosso; uno verde; e l'ultimo blu. Come già detto per ciascun pixel dovremo utilizzare tre byte nei dati grezzi.

50 36 20 33 20 31 20 32 35 35 0A FF 00 00 00 FF 00 00 00 FF

che va interpretata così:

50 P
36 6
20 spazio
33 3 colonne (i 3 pixel)
20 spazio
31 1 riga
20 spazio
32 35 35 profondità di 255 sfumature di colore
0A Salto di riga (chiude l'header)
FF 00 00 i tre byte del pixel rosso
00 FF 00 i tre byte del pixel verde
00 00 FF i tre byte del pixel blu

Salveremo il nostro codice con estensione .pnm .

Qualora volessimo aggiungere del testo di commento, opereremmo come già descritto ed esemplificato al riguardo nel paragrafo relativo alla "Scala di Grigi".



Note

[1] La profondità di colore rappresenta la gamma dei colori che possono essere rappresentati e mostrati. Così ad esempio una gamma di 255 colori in "Scala di Grigi" significa che sarà possibile avere un'estensione di 256 (da 0 a 255) tonalità intermedie di grigio, dal bianco (FF) al nero totale (00). Di più in rete su questo argomento:

[2] Va moltiplicato per 3, perché la definizione del colore di un pixel impegna tre byte.

[3] Va diviso per 8, perché la definizione di un pixel nel Bianco e Nero impegna soltanto 8 bit.

[4] In questo formato, come sappiamo, il nero ed il bianco - nella modalità "Scala di Grigi" - sono i valori estremi della gamma di sfumature del grigio.

[5] Quindi, mentre il formato monocromo (Bianco e Nero) PBM con tre byte definisce - seppur in bianco o nero - ben 24 pixel, il formato PGM (Scala di Grigio) definisce solo tre pixel.