2° LABORATORIO: FORMATO BMP

Il formato BMP

Il formato BMP è uno dei formati più semplici (sviluppato congiuntamente da Microsoft e IBM) ed è particolarmente diffuso sulle piattaforme Windows e OS/2. Un file BMP è un file bitmap, ovvero registra un'immagine sotto forma di tabella di punti (pixel). Gestisce i colori sia in RGB oppure mediante una palette indicizzata.
Il formato BMP è stato studiato in maniera tale da ottenere un bitmap indipendente dalla periferica di visualizzazione (DIB, Device independent bitmap).

La struttura di un file bitmap è la seguente :
- Titolo del file (in inglese File header)
- Titolo del bitmap (in inglese Information Header)
- Palette (opzionale)
- Corpo dell'immagine

Titolo del file (dall'inizio al 14-esimo byte)

Il titolo del file fornisce delle informazioni:
- sul tipo di file (Bitmap),
- la sua dimensione
- dove cominciano le informazioni riguardanti l'immagine vera e propria.

Il titolo ha un tracciato composto quindi da questi quattro campi :

OFFSET DIMENSIONE DESCRIZIONE

CODICE C

00 inizio 2 byte La firma (su due byte) [magic number], indica che si tratta di un file BMP. I valori ammessi sono:
BM => indica che si tratta di un Bitmap Windows.
BA => indica che si tratta di un Bitmap OS/2.
CI => indica che si tratta di un'icona di colore OS/2
CP => indica che si tratta di un puntatore di colore OS/2
IC => indica che si tratta di un'icona OS/2.
PT => indica che si tratta di un puntatore OS/2.
// Porzione di codice in C per leggere il 1° header
int int_var;
char char_2[2];
// Mi posiziono all'inizio del file    
fseek(fpo,0,0);
n = fread(char_2,2, 1, fpo);
printf(" - Firma: %c%c\n",char_2[0],char_2[1]);
fseek(fpo,2,0);
fread(&int_var, 1, sizeof(int), fpo);
printf(" - Dimensione File: %d\n",int_var);
fseek(fpo,10,0);
fread(&int_var, 1, sizeof(int), fpo);
printf(" - Offset: %d\n",int_var);
che produce questo esempio di output
- Firma                      : BM
- Dimensione File            : 146
- Offset                     : 118

il comando fseek in C consente di spostarsi all'interno di un file indicando la posizione in byte. il comando fread serve per leggere all'interno di un file. Una volta letto il programma si posiziona alla fine dell'area che è stata appena letta per cui è pronto a leggere l'informazione successiva. Un parametro di fread è rappresentato dal numero di byte da leggere

02° byte 4 byte - int La dimensione totale del file in byte (codificato a 4 byte)
06° byte 4 byte Un campo riservato (su 4 byte)
10° byte 4 byte - int

L'offset dell'immagine (su 4 Byte) , cioè dopo quanti byte (rispetto all'inizio) cominciano i dati che descrivono, punto per punto, l'immagine registrata

Titolo dell'immagine (dal 14-esimo al 54 byte)

Il titolo dell'immagine fornisce delle informazioni sulle caratteristiche dell'immagine tra cui le sue dimensioni in pixel e i suoi colori. Il titolo dell'immagine ha un tracciato composto da queste voci :

OFFSET DIMENSIONE DESCRIZIONE CODICE C
14-esimo byte 4 byte -int dimensione della sezione titolo dell'immagine in byte (codificata su 4 byte). Alcuni dei valori esadecimali possibili sono i seguenti:
    a) 28 per Windows 3.1x, 95, NT,…,  (40 byte)
    b) 0C per OS/2 1.x (12 byte)
    c) F0 per OS/2 2.x (64 byte)
    d) 6C per Windows 95, NT40,…,  (40 byte)
    e) 7C per Windows 98/2000 (124 byte)
fseek(fpo,14,0);
n = fread(&int_var,sizeof(int), 1, fpo);
printf(" - Dimensione Header Immagine : %d\n",int_var);
headers_size=int_var+14;
n = fread(&int_var,sizeof(int), 1, fpo);
printf(" - Larghezza                  : %d\n",int_var);
i_w=int_var;
n = fread(&int_var,sizeof(int), 1, fpo);
printf(" - Altezza                    : %d\n",int_var);
i_h=int_var;
fseek(fpo,28,0);
n = fread(&short_var,sizeof(short), 1, fpo);
printf(" - nr. bit per colore         : %hd\n",short_var);
nBit=short_var;
n = fread(&int_var,sizeof(int), 1, fpo);
if (int_var==0)
   printf(" - tipo compressione          : Nessuna\n");
else if (int_var==1)
   printf(" - tipo compressione          : RLE 8 Bit\n");
else if (int_var==2)
   printf(" - tipo compressione          : RLE 4 Bit\n");
else if (int_var==3)
   printf(" - tipo compressione          : Bitfields\n");
else
   printf(" - tipo compressione          : %d\n",int_var);
fread(&int_var, 1, sizeof(int), fpo);
printf(" - bytes immagine senza header: %d\n",int_var);
che produce questo esempio di output
- Dimensione Header Immagine : 40
- Larghezza                  : 7
- Altezza                    : 7
- nr. bit per colore         : 4
- tipo compressione          : Nessuna
- bytes immagine senza header: 28

il comando fseek in C consente di spostarsi all'interno di un file indicando la posizione in byte.

 

18-esimo byte 4 byte - int La larghezza dell'immagine (a 4 byte), cioè il numero di pixel orizzontale
22-esimo byte 4 byte - int L'altezza dell'immagine (a 4 byte), cioè il numero di pixel verticale
26-esimo byte 2 byte - short Il numero di piani (a 2 byte). Questo valore vale sempre 1
28-esimo byte 2 byte - short

La profondità di codifica (bpp=bit per pixel) del colore (su 2 byte), ovvero il numero di bit usati per codificare il colore.
  Questo valore può essere uguale a:
    a) 1 - bitmap monocromatica: 2 colori
    b) 4 - bitmap a 16 colori
    c) 8 -  bitmap a 256 colori
    d) 16 - 16bit (high color) bitmap
    e) 24 - 24bit (true color) bitmap

30-esimo byte 4 byte - int Il metodo di compressione (a 4 byte).
Questo valore vale:
   a) 0 quando l'immagine non è compressa
   b) 1 per codifica RLE di 8 bit per pixel
   c) 2 per codifica RLE da 4 bit per pixel
   d) 3 per codifica BITFIELDS, significa che il colore è codificato con una tripla maschera rappresentata dalla palette
   e) 4 indica che il bitmap contiene un JPEG
   f) 5  indica che il bitmap contiene un PNG
34-esimo byte 4 byte - int La dimensione totale dell'immagine in byte (a 4 byte) esclusa le parti relative alle prime 3 sezioni
38-esimo byte 4 byte - int La risoluzione orizzontale (a 4 byte) espressa in pixel per metro orizzontale  
42-esimo byte 4 byte - int La risoluzione verticale (su 4 byte) espressa in pixel per metro verticale  
46-esimo byte 4 byte - int Il numero di colori definiti nella palette (su 4 byte). Se vale 0 tutti i colori saranno utilizzati.  
50-esimo byte 4 byte - int Il numero di colori della palette (su 4 byte) che devono essere considerati importanti per la visualizzazione dell'immagine. Questo campo vale 0 quando tutti i colori hanno la medesima importanza  

Palette dell'immagine

La palette è opzionale. Quando è presente, contiene 4 byte per ognuna delle sue entrate ed esattamente:
- La componente blu (su un byte da 0 a 255)
- La componente verde (su un byte da 0 a 255)
- La componente rossa (su un byte da 0 a 255)
- Un campo riservato (su un byte) con tutti i bit posti a zero

Codifica dell'immagine

La codifica dell'immagine si effettua scrivendo successivamente i bit corrispondenti ad ogni pixel. La lettura delle info relative ad ogni pixel avviene linea per linea cominciando dal pixel in basso a sinistra.
- Le immagini a 2 colori usano 1 bit per pixel, il che significa che un byte permette di codificare 8 pixel
- Le immagini a 16 colori usano 4 bit per pixel, il che significa che un byte permette di codificare 2 pixel
- Le immagini a 256 colori usano 8 bit per pixel, il che significa che un byte codifica ogni pixel
- Le immagini in true color (rgb) usano 24 bit per pixel, il che significa che bisogna avere 3 byte per codificare ogni pixel, assicurandosi di rispettare l'ordine di alternanza blu, verde e rosso (si noti che la notazione è invertita rispetto alla RGB).
Ogni linea di pixel dell'immagine deve essere descritta mediante un numero totale di byte multiplo di 4. Se non è questo il caso, la linea deve essere completata con degli 0 in modo da rispettarne il criterio appena indicato.
 

Analizziamo ora in dettaglio byte per byte un file bitmap 2 x 2 a 24 bit.

Esempio a 24 Bit 2x2
Offset Size Hex Value Valore Descrizione
FILE HEADER
0h 2 42 4D "BM" Sigla
2h 4 46 00 00 00 70 Bytes Dimensione del file
6h 2 00 00 00 00 riservato Riservato
Ah 4 36 00 00 00 54 bytes Scostamento (offset) in bytes dove inizia l'immagine bitmap vera e propria
DIB HEADER
Eh 4 28 00 00 00 40 bytes lunghezza in byte di questo header.
12h 4 02 00 00 00 2 pixels Larghezza in pixel del bitmap
16h 4 02 00 00 00 2 pixels Altezza in pixel del bitmap
1Ah 2 01 00 1 piani numero di piani - vale sempre 1
1Ch 2 18 00 24 bits Numero di bit (colore) per pixel
1Eh 4 00 00 00 00 0 Nessuna compressione
22h 4 10 00 00 00 16 bytes Dimensione in byte dell'immagine bitmap senza le 3 sezioni iniziali
26h 4 13 0B 00 00 2,835 pixels/metro Risoluzione orizzontale in px al mt
2Ah 4 13 0B 00 00 2,835 pixels/metro Risoluzione verticale in px al mt
2Eh 4 00 00 00 00 0 Numero di colori da considerare nella palette (0 indica tutti)
32h 4 00 00 00 00 0 zero indica che tutti i colori sono importanti
INIZIO DEL BITMAP
36h 3 00 00 FF 0 0 255 Rosso, Pixel (1,0)
39h 3 FF FF FF 255 255 255 Bianco, Pixel (1,1)
3Ch 2 00 00 0 0 Riempimento con zeri poiché ogni linea deve contenere un multiplo di 4 byte
3Eh 3 FF 00 00 255 0 0 Blu, Pixel (0,0)
41h 3 00 FF 00 0 255 0 Verde, Pixel (0,1)
44h 2 00 00 0 0 Riempimento con zeri poiché ogni linea deve contenere un multiplo di 4 byte
LABORATORIO: (clicca qui per scaricare i files necessari)

Consideriamo 4 file BMP 7x7 pixel con 2, 24(=16), 28(=256) e 224 colori.

Si osservino le dimensioni in byte (+ colori sono rappresentati maggiore è la dimensione dell'immagine). Per analizzare i contenuti utilizziamo l'eseguibile che abbiamo appena scaricato. Tale eseguibile è ottenuto compilando con DEVC++ il seguente sorgente

#include <stdio.h>
#include <stdlib.h>

// Variabili globali parametri BMP
int iOffSet, i_w, i_h, headers_size,nBit;
unsigned char Palette[1024]; // 4 byte x 256 colori

void bin8(int n, char bina[])
{
     int i;
     for (i=0 ; i < 8 ; i++)
     {
         bina[7-i]=(n % 2)+'0';
         n = (n - (n % 2) ) /2;
     }
}

void DumpFile(char *Nf)
{
    unsigned char BitMap[64000L];
    char dig[3], bina[8];
    unsigned char d;
    int LungRow, nByte;
    int n=0, b=0,l;
    // Dimensione riga: multiplo di 4 byte
    LungRow=( (i_w*nBit)+(32-(i_w*nBit)%32) )/8;
	FILE *fpo;
    if ( (fpo=fopen(Nf,"rb"))==NULL )
    {
         printf("File non trovato!!");
         return;
    }
    fseek(fpo,iOffSet,0);
    printf("---------------------------------------------\n");
    printf("SEZIONE --> Bitmap data dell'immagine\n");
    printf("---------------------------------------------\n");
    nByte=nBit/8;
    if (nByte<1) nByte=1;
    l=fread(BitMap, sizeof(unsigned char), LungRow, fpo);
    while (l == LungRow)
    {
        for ( n=0 ; n < LungRow ; n++)
        {
            if ( (nBit==24) || (nBit==8) )
            {
                if (b==0) printf("[");
                printf("%02X",BitMap[n]);
                if (b==(nByte-1)) printf("]");
                b=(b+1) % nByte;
            }
            else if (nBit==4)
            {
                sprintf(dig, "%02X", BitMap[n]);
                printf("[%c] [%c] ",dig[0],dig[1]);
            }
            else if (nBit==1)
            {
                l=(int)BitMap[n];
                bin8(l,bina);
                printf("[%s]",bina);
            }
        }
        printf("\n");
        l=fread(BitMap, sizeof(unsigned char), LungRow, fpo);
    }
    while (!feof(fpo));
    printf("------------------------------------------------");
    fclose(fpo);
}

void InfoBMP(char *Nf)
{
    int n, j;
    FILE *fpo;

    fpo=fopen(Nf,"rb");
    printf("################################################\n");
    printf("# File: %s\n",Nf);
    printf("############################### vers. 1.1 ######\n");

    // Variabili per leggere
    int int_var;
    short short_var;
    float float_var;
    char char_2[2];
    
    printf("---------------------------------------------\n");
    printf("SEZIONE --> Titolo del File\n");
    printf("---------------------------------------------\n");
    fseek(fpo,0,0);
    n = fread(char_2,2, 1, fpo);
    printf(" - Firma                      : %c%c\n",char_2[0],char_2[1]);
    fseek(fpo,2,0);
    fread(&int_var, 1, sizeof(int), fpo);
    printf(" - Dimensione File            : %d\n",int_var);
    fseek(fpo,10,0);
    fread(&int_var, 1, sizeof(int), fpo);
    printf(" - Offset                     : %d\n",int_var);
    iOffSet=int_var;

    printf("---------------------------------------------\n");
    printf("SEZIONE --> Titolo dell'immagine\n");
    printf("---------------------------------------------\n");
    fseek(fpo,14,0);
    n = fread(&int_var,sizeof(int), 1, fpo);
    printf(" - Dimensione Header Immagine : %d\n",int_var);
    headers_size=int_var+14;
    n = fread(&int_var,sizeof(int), 1, fpo);
    printf(" - Larghezza                  : %d\n",int_var);
    i_w=int_var;
    n = fread(&int_var,sizeof(int), 1, fpo);
    printf(" - Altezza                    : %d\n",int_var);
    i_h=int_var;
    fseek(fpo,28,0);
    n = fread(&short_var,sizeof(short), 1, fpo);
    printf(" - nr. bit per colore         : %hd\n",short_var);
    nBit=short_var;
    n = fread(&int_var,sizeof(int), 1, fpo);
    if (int_var==0)
       printf(" - tipo compressione          : Nessuna\n");
    else if (int_var==1)
       printf(" - tipo compressione          : RLE 8 Bit\n");
    else if (int_var==2)
       printf(" - tipo compressione          : RLE 4 Bit\n");
    else if (int_var==3)
       printf(" - tipo compressione          : Bitfields\n");
    else
       printf(" - tipo compressione          : %d\n",int_var);
    fread(&int_var, 1, sizeof(int), fpo);
    printf(" - bytes immagine senza header: %d\n",int_var);
    printf("---------------------------------------------\n");
    printf("SEZIONE --> Palette dell'immagine\n");
    printf("---------------------------------------------\n");
    if (headers_size==iOffSet)
       printf(" - Palette                     : Non presente\n");
    else
    {
        fseek(fpo,headers_size,0);
        fread(Palette, sizeof(unsigned char), iOffSet-headers_size, fpo);
        for (n=0, j=0 ; n <( (iOffSet-headers_size)/4 ); n++)
        {
           printf("%02X^col. :%02lX",n, Palette[j++]);
           printf("%02lX",Palette[j++]);
           printf("%02lX | ",Palette[j++]);
           if ( ( (n+1) % 4)==0) printf("\n");
           j++;
        }
    }
    printf("\n");
    fclose(fpo);
    DumpFile(Nf);
}

int main(int argc, char *argv[])
{
   nBit=atoi(argv[1]);
   if (nBit==1)
      InfoBMP(".\\bmp7x7_01bit.bmp");
   else if (nBit==4)
      InfoBMP(".\\bmp7x7_04bit.bmp");
   else if (nBit==8)
      InfoBMP(".\\bmp7x7_08bit.bmp");
   else if (nBit==24)
      InfoBMP(".\\bmp7x7_24bit.bmp");
   else
      printf("Numeri ammessi: 1, 4, 8, 24");
}

Analizziamo ora l'output prodotto per ogni singolo file bmp

File: bmp7x7_01bit.bmp
OUTPUT OSSERVAZIONI
C:\arch_def_1\Scuola\sitoBrescianet>info_bmp 1
################################################
# File: .\bmp7x7_01bit.bmp
############################### vers. 1.1 ######
---------------------------------------------
SEZIONE --> Titolo del File
---------------------------------------------
- Firma                      : BM
- Dimensione File            : 90
- Offset                     : 62
---------------------------------------------
SEZIONE --> Titolo dell'immagine
---------------------------------------------
- Dimensione Header Immagine : 40
- Larghezza                  : 7
- Altezza                    : 7
- nr. bit per colore         : 1
- tipo compressione          : Nessuna
- bytes immagine senza header: 28
---------------------------------------------
SEZIONE --> Palette dell'immagine
---------------------------------------------
00^col. :000000 | 01^col. :FFFFFF |
---------------------------------------------
SEZIONE --> Bitmap data dell'immagine
---------------------------------------------
[
00000000][00000000][00000000][00000000]
[
00111000][00000000][00000000][00000000]
[
00010000][00000000][00000000][00000000]
[
00010000][00000000][00000000][00000000]
[
00110000][00000000][00000000][00000000]
[
00010000][00000000][00000000][00000000]
[
00000000][00000000][00000000][00000000]
------------------------------------------------
a) la codifica dell'immagine appare ribaltata infatti la registrazione parte dal pixel in basso a sinistra.
b) per ogni riga mi servono 7 pixel * 1 bit = 7 bit. Poiché il numero di byte per riga deve essere un multiplo di 4 devo aggiungere 25 bit fittizi in fondo
c) La palette è composta da due colori (bianco e nero) indicizzati con la posizione 0 e 1. Nella mappa di bit al posto del colore viene inserita la posizione nella palette del colore corrispondente.
 

File: bmp7x7_04bit.bmp
OUTPUT OSSERVAZIONI
C:\arch_def_1\Scuola\sitoBrescianet>info_bmp 4
################################################
# File: .\bmp7x7_04bit.bmp
################################################
---------------------------------------------
SEZIONE --> Titolo del File
---------------------------------------------
- Firma                      : BM
- Dimensione File            : 146
- Offset                     : 118
---------------------------------------------
SEZIONE --> Titolo dell'immagine
---------------------------------------------
- Dimensione Header Immagine : 40
- Larghezza                  : 7
- Altezza                    : 7
- nr. bit per colore         : 4
- tipo compressione          :
Nessuna
- bytes immagine senza header: 28
---------------------------------------------
SEZIONE --> Palette dell'immagine
---------------------------------------------
00^col. :000000 | 01^col. :000080 | 02^col. :008000 | 03^col. :008080 |
04^col. :800000 | 05^col. :800080 | 06^col. :808000 | 07^col. :808080 |
08^col. :C0C0C0 |
09^col. :0000FF | 0A^col. :00FF00 | 0B^col. :00FFFF |
0C^col. :FF0000 | 0D^col. :FF00FF | 0E^col. :FFFF00 | 0F^col. :FFFFFF |
---------------------------------------------
SEZIONE --> Bitmap data dell'immagine
---------------------------------------------
[C] [C] [C] [
0] [A] [A] [A] [0]
[C] [C] [C] [
0] [A] [A] [A] [0]
[
C] [C] [C] [0] [A] [A] [A] [0]
[
0] [0] [0] [0] [0] [0] [0] [0]
[F] [F] [F] [
0] [9] [9] [9] [0]
[F] [F] [F] [
0] [9] [9] [9] [0]
[F] [F] [F] [
0] [9] [9] [9] [0]
------------------------------------------------
a) si noti come la codifica dei colori dell'immagine utilizzi l'indice della palette
b) l'indice della palette parte da 0
c) Per ogni riga mi servono 7 pixel * 4 bit = 28 bit. Poiché il numero di byte per riga deve essere un multiplo di 4 byte devo aggiungerne 4 bit in fondo

File: bmp7x7_08bit.bmp
OUTPUT OSSERVAZIONI
C:\arch_def_1\Scuola\sitoBrescianet>info_bmp 8
################################################
# File: .\bmp7x7_08bit.bmp
################################################
---------------------------------------------
SEZIONE --> Titolo del File
---------------------------------------------
- Firma                      : BM
- Dimensione File            : 1134
- Offset                     : 1078
---------------------------------------------
SEZIONE --> Titolo dell'immagine
---------------------------------------------
- Dimensione Header Immagine : 40
- Larghezza                  : 7
- Altezza                    : 7
- nr. bit per colore         : 8
- tipo compressione          : Nessuna
- bytes immagine senza header: 56
---------------------------------------------
SEZIONE --> Palette dell'immagine
---------------------------------------------
00^col. :000000 | 01^col. :000080 | 02^col. :008000 | 03^col. :008080 |
04^col. :800000 | 05^col. :800080 | 06^col. :808000 | 07^col. :C0C0C0 |
08^col. :C0DCC0 | 09^col. :F0CAA6 | 0A^col. :002040 | 0B^col. :002060 |
0C^col. :002080 | 0D^col. :0020A0 | 0E^col. :0020C0 | 0F^col. :0020E0 |
10^col. :004000 | 11^col. :004020 | 12^col. :004040 | 13^col. :004060 |
14^col. :004080 | 15^col. :0040A0 | 16^col. :0040C0 | 17^col. :0040E0 |
18^col. :006000 | 19^col. :006020 | 1A^col. :006040 | 1B^col. :006060 |
1C^col. :006080 | 1D^col. :0060A0 | 1E^col. :0060C0 | 1F^col. :0060E0 |
20^col. :008000 | 21^col. :008020 | 22^col. :008040 | 23^col. :008060 |
24^col. :008080 | 25^col. :0080A0 | 26^col. :0080C0 | 27^col. :0080E0 |
28^col. :00A000 | 29^col. :00A020 | 2A^col. :00A040 | 2B^col. :00A060 |
2C^col. :00A080 | 2D^col. :00A0A0 | 2E^col. :00A0C0 | 2F^col. :00A0E0 |
30^col. :00C000 | 31^col. :00C020 | 32^col. :00C040 | 33^col. :00C060 |
34^col. :00C080 | 35^col. :00C0A0 | 36^col. :00C0C0 | 37^col. :00C0E0 |
38^col. :00E000 | 39^col. :00E020 | 3A^col. :00E040 | 3B^col. :00E060 |
3C^col. :00E080 | 3D^col. :00E0A0 | 3E^col. :00E0C0 | 3F^col. :00E0E0 |
40^col. :400000 | 41^col. :400020 | 42^col. :400040 | 43^col. :400060 |
44^col. :400080 | 45^col. :4000A0 | 46^col. :4000C0 | 47^col. :4000E0 |
48^col. :402000 | 49^col. :402020 | 4A^col. :402040 | 4B^col. :402060 |
4C^col. :402080 | 4D^col. :4020A0 | 4E^col. :4020C0 | 4F^col. :4020E0 |
50^col. :404000 | 51^col. :404020 | 52^col. :404040 | 53^col. :404060 |
54^col. :404080 | 55^col. :4040A0 | 56^col. :4040C0 | 57^col. :4040E0 |
58^col. :406000 | 59^col. :406020 | 5A^col. :406040 | 5B^col. :406060 |
5C^col. :406080 | 5D^col. :4060A0 | 5E^col. :4060C0 | 5F^col. :4060E0 |
60^col. :408000 | 61^col. :408020 | 62^col. :408040 | 63^col. :408060 |
64^col. :408080 | 65^col. :4080A0 | 66^col. :4080C0 | 67^col. :4080E0 |
68^col. :40A000 | 69^col. :40A020 | 6A^col. :40A040 | 6B^col. :40A060 |
6C^col. :40A080 | 6D^col. :40A0A0 | 6E^col. :40A0C0 | 6F^col. :40A0E0 |
70^col. :40C000 | 71^col. :40C020 | 72^col. :40C040 | 73^col. :40C060 |
74^col. :40C080 | 75^col. :40C0A0 | 76^col. :40C0C0 | 77^col. :40C0E0 |
78^col. :40E000 | 79^col. :40E020 | 7A^col. :40E040 | 7B^col. :40E060 |
7C^col. :40E080 | 7D^col. :40E0A0 | 7E^col. :40E0C0 | 7F^col. :40E0E0 |
80^col. :800000 | 81^col. :800020 | 82^col. :800040 | 83^col. :800060 |
84^col. :800080 | 85^col. :8000A0 | 86^col. :8000C0 | 87^col. :8000E0 |
88^col. :802000 | 89^col. :802020 | 8A^col. :802040 | 8B^col. :802060 |
8C^col. :802080 | 8D^col. :8020A0 | 8E^col. :8020C0 | 8F^col. :8020E0 |
90^col. :804000 | 91^col. :804020 | 92^col. :804040 | 93^col. :804060 |
94^col. :804080 | 95^col. :8040A0 | 96^col. :8040C0 | 97^col. :8040E0 |
98^col. :806000 | 99^col. :806020 | 9A^col. :806040 | 9B^col. :806060 |
9C^col. :806080 | 9D^col. :8060A0 | 9E^col. :8060C0 | 9F^col. :8060E0 |
A0^col. :808000 | A1^col. :808020 | A2^col. :808040 | A3^col. :808060 |
A4^col. :808080 | A5^col. :8080A0 | A6^col. :8080C0 | A7^col. :8080E0 |
A8^col. :80A000 | A9^col. :80A020 | AA^col. :80A040 | AB^col. :80A060 |
AC^col. :80A080 | AD^col. :80A0A0 | AE^col. :80A0C0 | AF^col. :80A0E0 |
B0^col. :80C000 | B1^col. :80C020 | B2^col. :80C040 | B3^col. :80C060 |
B4^col. :80C080 | B5^col. :80C0A0 | B6^col. :80C0C0 | B7^col. :80C0E0 |
B8^col. :80E000 | B9^col. :80E020 | BA^col. :80E040 | BB^col. :80E060 |
BC^col. :80E080 | BD^col. :80E0A0 | BE^col. :80E0C0 | BF^col. :80E0E0 |
C0^col. :C00000 | C1^col. :C00020 | C2^col. :C00040 | C3^col. :C00060 |
C4^col. :C00080 | C5^col. :C000A0 | C6^col. :C000C0 | C7^col. :C000E0 |
C8^col. :C02000 | C9^col. :C02020 | CA^col. :C02040 | CB^col. :C02060 |
CC^col. :C02080 | CD^col. :C020A0 | CE^col. :C020C0 | CF^col. :C020E0 |
D0^col. :C04000 | D1^col. :C04020 | D2^col. :C04040 | D3^col. :C04060 |
D4^col. :C04080 | D5^col. :C040A0 | D6^col. :C040C0 | D7^col. :C040E0 |
D8^col. :C06000 | D9^col. :C06020 | DA^col. :C06040 | DB^col. :C06060 |
DC^col. :C06080 | DD^col. :C060A0 | DE^col. :C060C0 | DF^col. :C060E0 |
E0^col. :C08000 | E1^col. :C08020 | E2^col. :C08040 | E3^col. :C08060 |
E4^col. :C08080 | E5^col. :C080A0 | E6^col. :C080C0 | E7^col. :C080E0 |
E8^col. :C0A000 | E9^col. :C0A020 | EA^col. :C0A040 | EB^col. :C0A060 |
EC^col. :C0A080 | ED^col. :C0A0A0 | EE^col. :C0A0C0 | EF^col. :C0A0E0 |
F0^col. :C0C000 | F1^col. :C0C020 | F2^col. :C0C040 | F3^col. :C0C060 |
F4^col. :C0C080 | F5^col. :C0C0A0 | F6^col. :F0FBFF | F7^col. :A4A0A0 |

F8^col. :808080 | F9^col. :0000FF | FA^col. :00FF00 | FB^col. :00FFFF |
FC^col. :FF0000
| FD^col. :FF00FF | FE^col. :FFFF00 | FF^col. :FFFFFF |
---------------------------------------------
SEZIONE --> Bitmap data dell'immagine
---------------------------------------------
[FC][FC][FC][
00][FA][FA][FA][00]
[
FC][FC][FC][00][FA][FA][FA][00]
[FC][FC][FC][
00][FA][FA][FA][00]
[
00][00][00][00][00][00][00][00]
[FF][FF][FF][
00][F9][F9][F9][00]
[FF][FF][FF][
00][F9][F9][F9][00]
[FF][FF][FF][
00][F9][F9][F9][00]
------------------------------------------------
a) si noti come la codifica dei colori dell'immagine utilizzi l'indice della palette
b) l'indice della palette parte da 0
c) per ogni riga mi servono 7 pixel * 8 bit = 7 byte. Poiché il numero di byte per riga deve essere un multiplo di 4 devo aggiungerne un byte fittizio in fondo

File: bmp7x7_24bit.bmp
OUTPUT OSSERVAZIONI
C:\arch_def_1\Scuola\sitoBrescianet>info_bmp 24
################################################
# File: .\bmp7x7_24bit.bmp
################################################
---------------------------------------------
SEZIONE --> Titolo del File
---------------------------------------------
- Firma                      : BM
- Dimensione File            : 222
- Offset                     : 54
---------------------------------------------
SEZIONE --> Titolo dell'immagine
---------------------------------------------
- Dimensione Header Immagine : 40
- Larghezza                  : 7
- Altezza                    : 7
- nr. bit per colore         : 24
- tipo compressione          : Nessuna
- bytes immagine senza header: 168
---------------------------------------------
SEZIONE --> Palette dell'immagine
---------------------------------------------
- Palette : Non presente
---------------------------------------------
SEZIONE --> Bitmap data dell'immagine
---------------------------------------------
[
FF0000][FF0000][FF0000][000000][00FF00][00FF00][00FF00][000000]
[
FF0000][FF0000][FF0000][000000][00FF00][00FF00][00FF00][000000]
[
FF0000][FF0000][FF0000][000000][00FF00][00FF00][00FF00][000000]
[
000000][000000][000000][000000][000000][000000][000000][000000]
[FFFFFF][FFFFFF][FFFFFF][
000000][0000FF][0000FF][0000FF][000000]
[FFFFFF][FFFFFF][FFFFFF][
000000][0000FF][0000FF][0000FF][000000]
[FFFFFF][FFFFFF][FFFFFF][
000000][0000FF][0000FF][0000FF][000000]
------------------------------------------------
-
a) si noti come la codifica dei colori dell'immagine parta dal pixel in basso a sinistra.
b) il colore è espresso in modo ribaltato BGR
c) non è definita alcuna palette nella codifica a 24 bit
d) per ogni riga mi servono 7 pixel * 24 bit = 21 byte. Poiché il numero di byte per riga deve essere un multiplo di 4 byte devo aggiungerne tre fittizi in fondo