Rappresentazione di immagini

Documenti analoghi
Cenni di fotogrammetria LE IMMAGINI DIGITALI

CODIFICA IMMAGINI IN BIANCO E NERO

Abbiamo visto come la codifica di testi sia (relativamente semplice) Con le immagini la questione è più complessa

Le immagini. Parametri importanti sono:

Image Elaboration. Image Processing

Sistemi di Elaborazione delle Informazioni

I.4 Rappresentazione dell informazione - Altre codifiche

Informatica. Comunicazione & DAMS A.A. 2015/16. Dr.ssa Valeria Fionda

Nozioni di grafica sul calcolatore. concetti di base

Tecnologie Multimediali a.a. 2016/2017. Docente: DOTT.SSA VALERIA FIONDA

INFORMATICA E PROGRAMMAZIONE PROF. M. GIACOMIN ESPERIENZA IN AULA: ELABORAZIONE DI IMMAGINI A COLORI IN LINGUAGGIO C

La codifica delle immagini

Segnale analogico. Analogico vs digitale. Segnale digitale. Trasformazione da analogico a digitale

Modulo 1: Le I.C.T. UD 1.3a: La Codifica Digitale delle Immagini

Rappresentazione dei numeri: il sistema di numerazione decimale

La codifica delle immagini

Il formato BITMAP. Introduzione. Il formato BITMAP

Università degli Studi di Ferrara. Docente: Dott. Andrea Silvestri. - Immagini -

1.3a: La Codifica Digitale delle Immagini

La codifica delle immagini

Programma del corso. Introduzione Rappresentazione delle Informazioni Calcolo proposizionale Architettura del calcolatore Reti di calcolatori

Rappresentazione delle Immagini. Corso di Informatica. Rappresentazione delle Immagini. Rappresentazione delle Immagini

Rappresentazione di immagini a colori. Rappresentazione dei colori. Rappresentazione dei colori LA RAPPRESENTAZIONE DELL INFORMAZIONE - II

Corso di Informatica modulo Informatica di Base 6 CFU. Immagini digitali: concetti di base

Elementi di grafica raster

Lez. 7 Immagini Digitali. Prof. Pasquale De Michele (Gruppo 2) e Raffaele Farina (Gruppo 1) 1

Rappresentazione digitale delle informazioni

La codifica delle immagini

Le immagini digitali. Grafica. Due approcci alla modellazione grafica

Rappresentazione delle informazioni LA RAPPRESENTAZIONE DELLE INFORMAZIONI. Grandezze digitali. Grandezze analogiche

Esercitazione: elaborare immagini bitmap

RAPPRESENTAZIONE DELLE INFORMAZIONI

Prof. Pagani corrado LA CODIFICA DELLE INFORMAZIONI FORMATI DEI FILE

Corso di Fondamenti di Informatica (M-Z) Prof. Aldo Franco Dragoni. Prova Scritta 19 aprile 2007

Corso di Informatica

RAPPRESENTAZIONE DELLE INFORMAZIONI

Le immagini digitali

Il sistema binario: bit e Byte Codifica del testo Il Byte come U.d.M. dell'informazione Multipli del Byte

La codifica del testo

Elementi di grafica raster

Strutture dati e loro organizzazione. Gabriella Trucco

Appunti del corso di Informatica 1 (IN110 Fondamenti) 5 Rappresentazione delle informazioni

Immagini digitali Appunti a cura del prof. ing. Mario Catalano

Rappresentazione binaria. Laboratorio di Informatica. Calcolatori digitali. N: numeri naturali. La codifica binaria. I primi 16 numeri binari

Modulo 1: Le I.C.T. UD 1.3d: La Codifica Digitale dei Video

Le immagini digitali

Formati e compressioni

C: panoramica. Violetta Lonati

COLORI. Nozioni di base, Sintesi additiva, Modo RGB, Canali e Istogramma. EDI II Colori, RGB, Canali, Istogramma 1

Informatica (Sistemi di elaborazione delle informazioni)

Le immagini digitali. Introduzione

STRUMENTI SELEZIONE A MANO LIBERA e FORBICI INTELLIGENTI

Come si passa dalle immagini reali alle informazioni digitali. Il funzionamento di una fotocamera digitale

Rappresentazione dei numeri naturali. La codifica associa alle informazioni dell alfabeto sorgente uno o più simboli dell alfabeto codice:

Esercizio. Una moneta viene lanciata 1000 volte. Su 1000 lanci, per 600 volte esce croce. Quale è la ridondanza presente nella moneta?

Informazione binaria: suoni, immagini, sequenze video

Immagini vettoriali. Immagini raster

FORMATI IMMAGINI. Formati Multimediali Francesca Gasparini

1.3d: La Codifica Digitale dei Video

Immagini digitali. il colore. risoluzione geometrica, radiometrica, spettrale, temporale. cenno ai formati di memorizzazione

L2 Operazioni su buffer di memoria. Corso di Visione Artificiale A.A. 2016/2017

La codifica delle immagini

Fotografia corso base. Educazione Permanente Treviso. Specifiche digitali. Federico Covre.

Marta Capiluppi Dipartimento di Informatica Università di Verona

1.2 Concetti base dell Informatica: Informazione

Elementi di grafica raster

L Caponetti. Una immagine digitale a livelli di grigio è una funzione: f : D [0,255]

Sistemi di Elaborazione delle Informazioni 6 CFU

La grafica digitale Anceschi Sandra. Workshop Disegnare digitale - A.A

Processamento delle immagini

Sistemi di Elaborazione delle Informazioni 6 CFU

Capitolo 2 Sorgenti. Rappresentazione digitale di. Testo Immagini Audio Video

Introduzione. Elementi di Informatica. Sistemi di Numerazione Addizionali. Sistemi di Numerazione. Sistemi di Numerazione Romano

La codifica dell informazione. Rappresentazione binaria. Rappresentazione posizionale in base 10

La codifica dell informazione

Laboratorio di Informatica

C M A P M IONAM A E M NT N O

Corso di Informatica

Sistemi di Elaborazione delle Informazioni

Rappresentazione binaria delle variabili (int e char)

Elaborazione di Segnali e Immagini (ESI)

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

Tecnologie per il web e lo sviluppo multimediale. Rappresentazione delle informazioni

CAPITOLO 4. Formati grafici

Esercitazione 1: Introduzione a MATLAB

DIMENSIONI DELLE IMMAGINI e PROFONDITA DEL COLORE. Gruppo Iseo Immagine 10 novembre A cura di Giancarlo Caperna bfi

Definizioni. Esempi di alfabeti

Corso di Telerilevamento Lezione 2

Modulo informatica di base 1 Linea 2

informazione costituiti da simboli che devono essere elaborati conoscenza più o meno esatta di fatti, situazioni, modi di

Complementi. - Ridefinizione di tipo - - Costrutto switch - - Programmazione su più file - - Parametri della funzione main - Funzione system -

Publishing & Editing Immagini

Informatica di Base - 6 c.f.u.

Formati multimediali e metadati: Immagini

Primi passi col linguaggio C

Modelli di Colore. Michele Nappi, Ph.D Università degli Studi di Salerno biplab.unisa.it

Fondamenti di Informatica 2. Codifica delle immagini

13. Colorimetria. La visione cromatica

file fisico file logico

Codifica delle immagini

Transcript:

Rappresentazione di immagini Il modo più immediato per rappresentare un'immagine è quello di considerarla suddivisa in un reticolo di punti detti pixel. Maggiore è il numero di pixel per unità di lunghezza (dpi: dot per inch) e migliore sarà la definizione dell'immagine Ad ogni pixel è essere associato un colore. I colori possono essere definiti numericamente in vari modi (RGB, CYMK ecc)

Rappresentazione dei colori (0,0,1) B Blu (1,1,1) Ad ogni punto del cubo corrisponde un miscela di colori proporzionali alle coordinate (dette RGB) R (0,0,0) (1,0,0) (0,1,0) G Verde Es. (0.5, 0.1, 0.2) corrisponde al 50% di rosso, 10% di verde e 20 % di blu Rosso

Rappresentazione dei colori (0,0,1) B (0,0,0) (1,1,1) (0,1,0) G Bianco L'origine delle coordinate corrisponde al Nero (assenza di colore) Il vertice opposto del cubo corrisponde al Bianco (presenza di tutti i colori) (1,0,0) R Nero

Rappresentazione dei colori (0,0,1) (0,0,0) B (1,1,1) (0,1,0) G I punti che stanno sulla diagonale Bianco Nero hanno la medesima percentuale dei tre colori fondamentali e corrispondo alla scala dei grigi (1,0,0) R Scala dei grigi

Rappresentazione dei colori (0,0,255) (0,0,0) B (255,255,255) (0,255,0) Nella rappresentazione dei colori le coordinate, anziché essere espresse tra 0 e 1 sono espresse (quantizzate) con un intero tra 0 e 255 (un byte) (255,0,0) G In tal caso si parla di colore a 24 bit R

Rappresentazione di immagini Un immagine di 640 x 480 pixel può essere rappresentata con una matrice Se l'immagine è monocromatica ogni punto è rappresentabile con un bit 0 : punto bianco 1 : punto nero L'occupazione di memoria è bassa: 640*480/8=38.400 bytes 1024*768/8=98.304 bytes

Rappresentazione di immagini Se l'immagine è in scala di grigio ogni pixel rappresenta una tonalità di grigio compresa tra 0 e 255 (1 byte) 0 : punto bianco 255 : punto nero L'occupazione di memoria è intermedia: 640*480=307.200 bytes 1024*768=786.432 bytes

Rappresentazione di immagini Una matrice tridimensionale può consentire di rappresentare un immagine a colori. Ogni colore è definito da tre componenti (RGB: Red, Green, Blue) L'intensità di ogni componente viene rappresentata da un intero compreso tra 0 e 255 (un byte). Es. {0,0,0} rappresenta il nero {255,255,255} rappresenta il bianco Questa è la rappresentazione dei colori a 24 bit

Rappresentazione di immagini Possiamo immaginare di rappresentare un'immagine bidimensionale con una matrice di punti colorati (pixel). Un immagine di 640 punti di larghezza e 480 di altezza sarà rappresentabile da una matrice imm[480][640][3] il valore imm[50][120][2] ci dirà quanto rosso è contenuto nel pixel di riga 50 e colonna 120

Rappresentazione di immagini L'immagine occuperà una quantità di memoria pari a R*C*3 bytes dove R e C sono le righe e le colonne Es. 640 x 480 con 24 bits di colore: occupazione: 640*480*3=921.600 bytes (ca 1 Mbyte!) Es.1024 x 768 con 24 bits di colore: occupazione: 1024*768*3=2.359.296 bytes

E' il formato più semplice (ma anche il più dispendioso in termini di memoria) per rappresentare le immagini E' un file binario costituito da: un header (di 54 bytes) una (eventuale) palette di colori (massimo 256 colori corrispondenti a 1024 bytes) i dati RGB riguardanti i pixel Header Palette dati RGB

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 Header Palette dati RGB

L'header contiene informazioni riguardanti l'immagine e la posizione nel file dei dati RGB Contiene la lunghezza complessiva dell'header e della palette ed è quindi un puntatore ai dati RGB id[2] filesize reserved[2] headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 14 18 22 26 28 30 34 38 42 46 50 53... Palette dati RGB

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00

Contiene la lunghezza della parte indicata in verde dell'header id[2] filesize reserved[2] headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 14 18 22 26 28 30 34 38 42 46 50 53... Palette dati RGB

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 Contiene la lunghezza della parte indicata in verde dell'header: 0x28 = 40

Contengono la larghezza e l'altezza dell'immagine (in pixel) id[2] filesize reserved[2] headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 14 18 22 26 28 30 34 38 42 46 50 53... Palette dati RGB

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 Larghezza e altezza dell'immagine (in pixel)

id[2] filesize reserved[2] Contiene la profondità di colore in bit per pixel headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 16 20 24 26 28 30 34 38 42 46 50 53... Palette dati RGB

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 Contiene la profondità di colore in bit per pixel: 0x18=24

Contiene la dimensione in bytes dei dati RGB id[2] filesize reserved[2] headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 14 18 22 26 28 30 34 38 42 46 50 53 imagesize... Palette dati RGB

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 Contiene la dimensione in bytes dei dati RGB 0x30=48 I dati RGB (la parte arancione) è formata da 48 bytes.

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 Contiene la dimensione in bytes dei dati RGB 0x30=48 Ma se sono 12 pixel in tutto e ogni pixel occupa 3 bytes perchè i dati RGB non sono in totale 36 bytes?

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 ff ff ff ff ff ff 00 00 00 00 00 00 ff ff ff cd cf 2c ff ff ff 00 00 00 ff ff ff 00 00 00 ff ff ff ff ff ff Ogni riga dell'immagine deve occupare un numero di bytes multiplo di 4 9 bytes (non è un multiplo di 4)

Esempio di un file di 4 righe e 3 colonne: Vengono aggiunti dei bytes fittizi per aggiustare dimensione della riga la riga 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 12 bytes ( multiplo di 4)

Esempio di un file di 4 righe e 3 colonne: 00000000 42 4d 66 00 00 00 00 00 00 00 36 00 00 00 28 00 00000010 00 00 03 00 00 00 04 00 00 00 01 00 18 00 00 00 00000020 00 00 30 00 00 00 13 0b 00 00 13 0b 00 00 00 00 00000030 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 00 00000040 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff 00000050 ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff 00000060 ff ff ff 00 00 00 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 00 ff ff ff cd cf 2c 00 00 00 ff ff ff 00 00 00 ff ff ff 00 00 00 00 00 00 ff ff ff ff ff ff 00 00 00 12 bytes ( multiplo di 4)

Il problema si complica se consideriamo lunghezze di riga che fanno avanzare un numero di bytes pari a 1 o 2 (es. 5 pixel per riga corrispondono a 15 bytes che faranno occupare in realtà 16 bytes ad ogni riga) ff ff ff ff ff ff 00 00 00 00 bb 00 01 10 aa 00 00 00 00 ff ff ff cd cf 2c aa 42 09 20 24 bf 00 ff ff ff 00 00 00 ff ff ff 21 ae f0 34 32 fe 00 00 00 00 ff ff ff ff ff ff cc 00 00 5f 10 ca 00 16 bytes (multiplo di 4)

Ricapitolando: I dati RGB vengono allocati per riga Ogni riga ha una dimensione in bytes multipla di 4 Se il numero di pixel per riga non è multiplo di 4 allora ci saranno dei bytes non utilizzati in fondo ad ogni riga Ciò rende difficoltoso la mappatura dei dati RGB su un matrice

id[2] filesize reserved[2] headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 14 18 22 26 28 30 34 38 42 46 50 53 struct { char id[2]; unsigned long filesize; short int reserved[2]; unsigned long headersize;...... } unsigned long infosize; unsigned long width; unsigned long heigth; short int biplanes; short int colordepth; unsigned long compression; unsigned long imagesize; long horres; long verres; unsigned long colorsnumber; unsigned long importantcolor;

typedef struct { char id[2]; unsigned long filesize; short int reserved[2]; unsigned long headersize; unsigned long infosize; unsigned long width; unsigned long heigth; short int biplanes; short int colordepth; unsigned long compression; unsigned long imagesize; long horres; long verres; unsigned long colorsnumber; unsigned long importantcolor; } BMPHEADERINFO E' necessario mantenere la corrispondenza tra le lunghezze: long occupa 4 bytes (anche l'unsigned) short int occupa 2 bytes Il problema è l'allineamento dei dati in RAM

typedef struct { char id[2]; unsigned long filesize; short int reserved[2]; unsigned long headersize; unsigned long infosize; unsigned long width; unsigned long heigth; short int biplanes; short int colordepth; unsigned long compression; unsigned long imagesize; long horres; long verres; unsigned long colorsnumber; unsigned long importantcolor; } BMPHEADERINFO Un dato da 4 bytes viene allocato su un indirizzo multiplo di 4 Un dato da 2 bytes viene allocato su un indirizzo multiplo di 2 Si possono quindi avere dei buchi tra i campi

id[2] filesize reserved[2] headersize infosize width heigth colordepth imagesize............ 0 1 2 6 8 10 14 18 22 26 28 30 34 38 42 46 50 53 id[2] filler di due bytes filesize reserved[2] headersize infosize width heigth colordepth struct { char id[2]; unsigned long filesize; short int reserved[2]; unsigned long headersize;... imagesize............ 0 1 2 3 4 8 10 12 16 20 24 28 30 32 36 40 44 48...

int dist(void *p1, void*p2){ return p1-p2; } Si può verificare stampando la distanza di ogni campo dall'inizio della struttura e la dimensione di ogni campo, con un programma di prova main(int argc, char *argv[]){ BMPHEADERINFO b; printf("%15s %4d%4d\n","id[0]",dist(&b.id[0],&b),sizeof(b.id[0])); printf("%15s %4d%4d\n","id[1]",dist(&b.id[1],&b),sizeof(b.id[1])); printf("%15s %4d%4d\n","fileSize",dist(&b.fileSize,&b),sizeof(b.fileSize)); printf("%15s %4d%4d\n","reserved",dist(&b.reserved[0],&b),sizeof(b.reserved[0])); printf("%15s %4d%4d\n","reserved",dist(&b.reserved[1],&b),sizeof(b.reserved[1])); printf("%15s %4d%4d\n","headerSize",dist(&b.headerSize,&b),sizeof(b.headerSize)); printf("%15s %4d%4d\n","infoSize",dist(&b.infoSize,&b),sizeof(b.infoSize)); printf("%15s %4d%4d\n","width",dist(&b.width,&b),sizeof(b.width)); printf("%15s %4d%4d\n","heigth",dist(&b.heigth,&b),sizeof(b.heigth)); printf("%15s %4d%4d\n","biPlanes",dist(&b.biPlanes,&b),sizeof(b.biPlanes)); printf("%15s %4d%4d\n","colorDepth",dist(&b.colorDepth,&b),sizeof(b.colorDepth)); printf("%15s %4d%4d\n","compression", dist(&b.compression,&b),sizeof(b.compression)); printf("%15s %4d%4d\n","imageSize",dist(&b.imageSize,&b),sizeof(b.imageSize)); printf("%15s %4d%4d\n","horRes",dist(&b.horRes,&b),sizeof(b.horRes)); printf("%15s %4d%4d\n","verRes",dist(&b.verRes,&b),sizeof(b.verRes)); printf("%15s %4d%4d\n","colorsNumber",dist(&b.colorsNumber,&b), sizeof(b.colorsnumber)); printf("%15s %4d%4d\n","importantColor",dist(&b.importantColor,&b), sizeof(b.importantcolor)); }

id[0] 0 1 id[1] 1 1 filesize 4 4 reserved 8 2 reserved 10 2 headersize 12 4 infosize 16 4 width 20 4 heigth 24 4 biplanes 28 2 colordepth 30 2 compression 32 4 imagesize 36 4 horres 40 4 verres 44 4 colorsnumber 48 4 importantcolor 52 4 Se i campi fossero allocati di seguito sommando la seconda e la terza colonna di ogni riga si dovrebbe ottenere la seconda colonna della riga successiva. Il risultato indica che il campo filesize invece di iniziare al byte 2 della struttura inizia al byte 4.

typedef Dichiarando la struct { char id[2]; unsigned long filesize; short int reserved[2]; unsigned long headersize; unsigned long infosize; unsigned long width; unsigned long heigth; short int biplanes; short int colordepth; unsigned long compression; unsigned long imagesize; long horres; long verres; unsigned long colorsnumber; unsigned long importantcolor; } attribute (( packed )) BMPHEADERINFO struttura PACKED si compattano tutti i campi evitando la formazione dei buchi. Attributo PACKED della struttura

id[0] 0 1 id[1] 1 1 filesize 2 4 reserved 6 2 reserved 8 2 headersize 10 4 infosize 14 4 width 18 4 heigth 22 4 biplanes 26 2 colordepth 28 2 compression 30 4 imagesize 34 4 horres 38 4 verres 42 4 colorsnumber 46 4 importantcolor 50 4 La stampa del programma di prova fornisce il risultato adeguato.