Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
Codifica dell’Informazione
Prerequisiti: -
Introduzione (La macchina universale ed i vari tipi di computer, architettura di base di un PC); Internet ed il World Wide Web (Connessione, Internet Provider, Posta elettronica, WWW: funzionamento, motori di ricerca, pagine web);
1. Dal file al formato binario L’unità di informazione a cui ci siamo riferiti finora è essenzialmente il file: un’immagine, un testo, un brano musicale possono essere memorizzati in file distinti. Abbiamo imparato a considerare questi oggetti mediali come a dei dati, che possono essere processati in modo diverso secondo il tipo di informazione ed il software in dotazione. Possiamo quindi visualizzare ed eventualmente ritoccare un’immagine, leggere e modificare un testo ed anche ascoltare e comporre un brano musicale. In realtà un file è un aggregato di informazioni: ad esempio un testo è un insieme di caratteri ed un’immagine è composta da vari pixel (picture element). Di conseguenza, la memorizzazione dell’oggetto finale che viene adoperato dall’utente, comporta la memorizzazione della sequenza completa dei dati che compongono l’informazione completa. Quando parliamo di memorizzazione e di elaborazione dei file, dobbiamo quindi sempre tenere presente che riferiamo queste azioni alle singole parti che li compongono: per memorizzare un testo, in effetti memorizziamo tutti i caratteri che lo compongono (oltre alla punteggiatura, alla tabulazione ed altre informazioni quali la dimensione ed il tipo di carattere, lo stile, etc.) e del resto per elaborarlo compiamo delle azioni che vengono
-
Software (software di sistema, software applicativo: videoscrittura, fogli elettronici, database, presentazioni, etc.)
Preliminare per: -
Architettura ed Hardware; Reti; Programmazione;
eseguite carattere per carattere. Un esempio di questo, può essere fornito dall’esecuzione della funzione “trova” comune a molti word processor, che consiste nel trovare una parola nel testo e di evidenziarla. Supponiamo di cercare la parola (sequenza di caratteri) “cantante” all’interno di un testo. Il nostro software scandirà tutti i caratteri del testo, confrontandoli con i caratteri appartenenti alla sequenza data, fino a quando non troverà una sequenza identica. Nel caso in esame, partirà con il cercare una “c”. Non appena avrà trovato questa lettera nel testo, controllerà il carattere immediatamente successivo, che dovrà essere una “a”, e così via fino a quando non troverà un carattere diverso o arriverà fino alla “e”. Nel primo caso, dovrà fare ripartire la ricerca dalla “c”, nel secondo invece segnalerà all’utente l’occorrenza trovata. Esercizio: provare a vedere cosa succede passo dopo passo nel caso in cui nel testo sia presente la parola “canzone”. È ovvio che l’utente non si accorgerà di tutto questo, poiché l’elaborazione verrà fatta interamente dal nostro software ed in tempi molto veloci. A voler essere precisi, il problema è ben più complesso, dato che anche il carattere è un aggregato di informazioni; infatti, ogni carattere è in genere
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
1
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
composto da sequenze di cifre binarie, (0 ed 1), che sono le vere unità di informazione di un computer. Riferendosi all’esempio precedente, il nostro sistema composto dal software e dal computer, andrà a fare i confronti cifra binaria per cifra binaria, fino a quando non troverà una sequenza di 0 e di 1 identica alla sequenza corrispondente alla parola “cantante”. Il motivo per cui un computer utilizzi le cifre binarie per memorizzare ed elaborare l’informazione, ha delle motivazioni essenzialmente tecnologiche: il calcolatore è un insieme di dispositivi elettronici e la cosa più elementare che un sistema di questo tipo “capisce”1 è la presenza di tensione elettrica. In sintesi, in un circuito sono riproducibili i due stati acceso (ON) e spento (OFF). È per questo motivo che la logica booleana, basata sui valori vero e falso e la codifica binaria, basata sulle cifre 1 e 0, sono così utilizzate in informatica: sono essenzialmente dei simboli direttamente riconducibili agli stati on ed off. Possiamo considerare questa associazione iniziale (1 = on, 0 = off) come ad un primo livello di traduzione tra formati: due stati fisici sono tradotti in termini di simboli matematici. Nel corso del capitolo saliremo di livello in livello. Abbiamo infatti bisogno di arrivare a capire come due sole cifre possano servire a rappresentare informazioni complesse e composte a loro volta di aggregati di informazioni. Vedremo quindi come sia possibile rappresentare caratteri e numeri, che compongono le basi per i 1
Un po’ tutti tendiamo ad umanizzare il computer utilizzando termini appartenenti più alla sfera cognitiva umana che alla terminologia scientifica/tecnica. È chiaro che un computer non capisce nulla, o almeno non nel modo in cui un uomo percepisce il mondo e lo analizza. Ma bisogna pure far passare dei concetti senza entrare nello specifico delle caratteristiche dei circuiti elettrici! Poiché la nostra comprensione passa attraverso la percezione degli eventi attraverso l’attività sensoriale, assumiamo che il computer “capisca” in base alla percezione che avviene grazie ai suoi sensori ed ai suoi circuiti.
testi e per i formati numerici che consentono di fare calcoli difficili. Inoltre, vedremo come sia possibile rappresentare i colori da associare ad ogni pixel di una immagine, fino ad ottenere la cosiddetta “qualità fotografica”. Le immagini stesse, una volta che sia stabilito tra di loro un ordine temporale, pongono le basi per i video digitali. Infine, vedremo come sia possibile rappresentare quella che tra le informazioni possibili sembra la più eterea e quindi apparentemente non rappresentabile: il suono. A fare da sfondo a tutto il nostro discorso, ci sarà sempre il concetto di formato o codifica dell’informazione: un sistema di traduzione di simboli in altri simboli, i quali costituiscono a loro volta un altro formato. È per questo motivo che abbiamo parlato di livelli di traduzione: da un livello basso dell’informazione, costituita da cifre binarie, saliamo verso un livello più alto e quindi più comprensibile e più facilmente gestibile da un essere umano. In questa verticalità della trasformazione dell’informazione risiede uno degli compiti più importanti dell’informatica: permettere l’illusione di avere a che fare con rappresentazioni della realtà estremamente verosimiglianti, senza preoccuparsi che queste non siano altro che sequenze lunghissime di 0 e di 1, esattamente come lo spettatore sospende la propria incredulità al cinema, dove quelle immagini in movimento sono in realtà fisse e riprodotte in modo tale da ingannare il suo occhio.
2. Il sistema binario L’uomo ha imparato a contare in base 10, come ci insegnano gli antropologi, perché ha dieci dita. La cultura araba ha inventato dei simboli che ancora oggi usiamo e che chiamiamo cifre decimali: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Dalla composizione di queste cifre, l’uomo riesce a rappresentare numeri di qualsiasi valore (i numeri reali). Sulla base di questi numeri, ha creato la matematica di
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
2
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
cui si è servito per rappresentare e spiegare i fenomeni che lo circondavano. Purtroppo, i computer non riescono a contare se non con due ipotetiche dita. Per questo le cifre che possiamo utilizzare sono soltanto 0 ed 1. Definiamo con il termine bit (binary digit) una cifra binaria. Il bit è l’unità di informazione più piccola che possa essere rappresentata, ed è così piccola che risulta essere quasi inutilizzabile per dare una misura della capacità di memorizzazione di un computer o di un dispositivo o per determinare l’occupazione di memoria di un informazione o di un file. È per questo motivo che la capacità di memoria di un dispositivo e l’occupazione di memoria di un’informazione sono misure espresse in byte (o in multipli di byte), dove un byte è costituito da otto bit. Per esprimere i multipli del byte, utilizziamo la terminologia adottata anche in altri sistemi di misura, ovvero i prefissi Kilo, Mega, Giga, Tera, Peta, con una sostanziale differenza: nel S.I. (Sistema Internazionale) questi prefissi vengono riferiti alle potenze del 10 (Kilo → 103, Mega → 106, Giga → 109, Tera → 1012, Peta → 1015), mentre qui ci riferiamo a potenze di 2 che approssimano quelle cui siamo abituati (KiloByte → 210 byte, MegaByte → 220 byte, GigaByte → 230 byte, TeraByte → 240 byte, PetaByte → 250 byte). Di seguito riportiamo una tabella riassuntiva: Termine
Abbr.
KiloByte KB MegaByte MB
Definizione (in termini di byte) 10 2 (1024)
220
Valore approssimato (in byte) ∼ mille ∼ milione
(1024x1024) GigaByte
GB
230
TeraByte
TB
240
∼ mille miliardi
(1024x1024x 1024x1024)
2.1 Esempio: occupazione di memoria di un file Il File System di tutti i sistemi operativi, permette di risalire alla dimensione di ogni documento memorizzato, e quindi alla sua occupazione di memoria. Tale dato è in byte, anche se il programma di esplorazione risorse può visualizzarlo utilizzando il valore corrispondente in KB, MB o GB e via dicendo per maggiore facilità di comprensione. Utilizzando l’applicazione “Gestione Risorse” dei sistemi MS Windows, è possibile accedere a tale dato in due modi diversi: a. Tramite il menù a comparsa “Visualizza” della finestra di “Esplora risorse”, è possibile selezionare la voce “Dettagli”. In questo modo sarà possibile leggere l’Informazione Dimensione per tutti i file presenti nella cartella; b. Selezionando un file con il mouse, si potrà leggere l’informazione Dimensioni sulla parte sinistra della finestra di “Esplora risorse”. In entrambi i casi, si leggerà un valore approssimato, espresso con l’unità di misura più comoda per il file selezionato (vedi Figura 1). È possibile conoscere il valore esatto in byte, tramite la finestra delle proprietà del file, che si può aprire facendo clic con il tasto destro del mouse e selezionando la voce “Proprietà” dal menù a comparsa verticale (vedi Figura 2).
∼ miliardo
(1024x1024x 1024)
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
3
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
Figura 1: Dimensione dei file
ancora a disposizione? E quanta ne abbiamo già occupata? Se si utilizza un sistema MS Windows, per conoscere la capacità di memoria di un’unità di disco, basta accedere all’area “Risorse del Computer” dall’applicazione “Esplora risorse”. Basta selezionare l’unità di disco desiderata e leggere l’informazione sulla parte sinistra della finestra dell’applicazione. In questo caso, verrà data anche una rappresentazione grafica che rende più chiaro il rapporto tra spazio occupato e spazio ancora disponibile (Figura 3).
Figura 2: Finestra delle proprietà del File
2.2 Esempio: capacità di memoria di un’unità di disco Un’altra informazione molto utile risponde alle domande: quanta memoria abbiamo
Figura 3: capacità di un'unità di disco
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
4
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
3. Codifiche di caratteri e di simboli Fin qui, abbiamo introdotto le unità di misura che usiamo per misurare la capacità e l’occupazione di memoria, ma niente abbiamo detto su come le cifre binarie possano servire per rappresentare informazioni più complesse di 0 e di 1. In effetti, per rappresentare un’informazione o un simbolo utilizziamo una sequenza di cifre binarie. Ad ogni sequenza verrà associato uno ed un solo simbolo. Tramite una codifica di questo tipo, rendiamo possibile la traduzione in entrambi i sensi: da sequenza di bit a simbolo e viceversa. Supponiamo di voler rappresentare le lettere dell’alfabeto italiano: a, b, c, d, etc. Una soluzione possibile è la seguente: A B C D E F G H I L M
00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010
N O P Q R S T U V Z
01011 01100 01101 01110 01111 10000 10001 10010 10011 10100
Esercizio: Dato il codice precedente: 1. Tradurre in formato binario, la parola “computer”; 2. Tradurre in simboli alfabetici la sequenza: 001110000001001 Dall’esempio precedente risultano immediatamente chiari i seguenti problemi: a) Dato un codice che trasforma sequenze di cifre binarie in simboli, oltre all’associazione tramite tabella, deve essere nota anche la lunghezza (fissa) della sequenza di cifre binarie che corrispondono ad un simbolo dell’alfabeto che stiamo rappresentando. b) Dato un qualsiasi codice, esso rappresenterà un insieme di simboli finito. Tale limite ci è dato
dalla lunghezza fissa di cui al punto a). c) Se abbiamo bisogno di rappresentare altri simboli (cifre numeriche, punteggiatura, caratteri speciali), dobbiamo estendere o addirittura cambiare il codice adottato. Approfondiamo ora i diversi punti. Svolgendo l’esercizio proposto, abbiamo visto come sia semplice arrivare dalla parola “computer” ad una sequenza di cifre binarie. Per fare il viceversa, invece dobbiamo frammentare la sequenza di bit per individuare le singole lettere. Tutti sanno che lo zero posto davanti ad una sequenza di cifre non ha valore. Probabilmente, molti avranno pensato che esso possa essere tolto senza cambiare valore al numero con cui abbiamo a che fare. In quest’ottica, la sequenza: 001110000001001 può cambiare in: 1110000001001 Qui dobbiamo stare molto attenti, perché non stiamo parlando di valori numerici, ma di codici: tutto qui ha una sua importanza. Inoltre, diverse frammentazioni sono possibili. Ne riportiamo alcune: 1. 0011 | 100 | 00001| 001 2. 00111 | 00 | 000 | 01001 3. 00111 | 00000 | 01001 Considerando queste frammentazioni e consultando la nostra tabella, vengono fuori diverse traduzioni: 1. D (00011) | E (00100) | B (00001) | B (00001) → DEBB 2. H | A | A | L → HAAL 3. H | A | L → HAL L’ambiguità nasce dal fatto che nel primo e nel secondo caso, non abbiamo considerato che lunghezza fissa delle sequenze nel codice fosse di 5 cifre, oltre che a non usare correttamente lo zero. Nel terzo caso, invece, senza alcuna ambiguità, risaliamo alla parola esatta (con il codice dato): HAL. Quindi, una regola da tenere a mente sempre è che ogni codice fa riferimento
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
5
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
ad una sequenza di bit dalla dimensione fissata. Questo ovviamente rappresenta un limite. Tenendo presente il codice dell’esempio (dimensione: 5 bit) notiamo che possiamo rappresentare simboli tramite codice che vanno dalla sequenza 00000 alla sequenza 11111. Se facciamo i conti, possiamo rappresentare massimo 32 simboli diversi. In generale, data una sequenza di n bit, il numero massimo di simboli che possiamo rappresentare è dato dal valore: 2n Tornando alla codifica dell’esempio, supponiamo di voler aggiungere simboli importanti quali le lettere minuscole, la punteggiatura ( , . ; : ! ” ? ’ \ etc.), segni matematici (+, -, *, {, [, ≥, ∞, >, etc.), caratteri nazionali (à, è, ì, ò, ù, ç, æ, ö, etc.) ed altri simboli speciali (€, @, #, §, &, %, $, etc. ), ci rendiamo subito conto che 5 bit sono troppo pochi. I codici utilizzati in pratica associano ad ogni carattere un minimo di 8 bit (1 byte). Un esempio di tale codice è dato dall’American Standard Code Information Interchange, o – più semplicemente – ASCII. Di seguito riportiamo una porzione della tabella del codice ASCII:
……. 0011 0000 48 0 0100 0001 65 A 0011 0001 49 1 0100 0010 66 B 0011 0010 50 2 0100 0011 67 C 0011 0011 51 3 ……. ……. 0101 1000 88 X 0011 1010 58 : 0101 1001 89 Y 0011 1011 59 ; 0101 1010 90 Z 0011 1100 60 < ……. 0011 1101 61 = 0110 0001 97 a ……. 0110 0010 98 b 1010 0100 164 ñ 0110 0011 99 c 1000 0111 135 ç Nella tabella, oltre al codice binario associato al simbolo (es. 01000001 corrisponde alla lettera “A”), viene riportato anche il valore decimale
corrispondente al codice dato. Infatti, il numero binario 01000001, se convertito in decimale, è uguale a 652. Questo è molto utile per chi utilizza il codice ASCII: è più facile riprodurre (o ricordare) un numero in base dieci piuttosto che la sequenza di otto cifre binarie. Inoltre, se dobbiamo usare una tastiera che non contiene alcuni simboli che sappiamo invece essere presenti nella tabella ASCII, possiamo risalire ad essi dal loro codice. Ad esempio, uno dei caratteri che fanno più “impazzire” gli utenti italiani di Internet è la “tilde” ovvero il carattere ~. Nella tastiera italiana, questo carattere non è presente, ma ha un suo codice ASCII, che corrisponde al valore decimale 126. Provate infatti a tenere il tasto “Alt” premuto mentre digitate la sequenza 126 con la tastiera numerica del vostro computer: se la configurazione del sistema lo permette, vedrete comparire il carattere “~” sullo schermo. Osservazione: il codice ASCII permette di rappresentare al massimo 256 simboli. Perché? Esistono altri codici, tra cui citiamo i più diffusi: - EBCDIC (Extended Binary Coded Decimal Interchange Code): usato dai mainframe ed in generale da computer di grosse dimensioni; - UNICODE: è un’estensione del codice ASCII, permettendo la rappresentazione di tutti i vari simboli etnici. Ogni simbolo è rappresentato da 2 byte (16 bit) e quindi permette la gestione di 65.536 caratteri. - MSWINDOWS: è una codifica proprietaria Microsoft simile ad UNICODE.
2
Più avanti ripasseremo come convertire i valori in notazione binaria in decimale e viceversa.
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
6
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
3.1
Esempio: testo in formato ASCII ed in formato Word
Siamo abituati ad associare i file con estensione .doc al programma di video scrittura MS Word. Ma quando scriviamo con questo programma è bene capire che non stiamo usando il formato di caratteri più diffuso al mondo, ovvero ASCII. Per apprezzare opportunamente la differenza, facciamo un piccolo esperimento: eseguiamo innanzitutto un’applicazione che ci permetta di salvare il documento finale in formato ASCII. Un esempio di tale applicazione è “Blocco Note” (Notepad). Ora scriviamo semplicemente la frase “Nel mezzo del cammin di nostra vita”. Salviamo dunque il file (chiamiamolo “dante.txt”3) ed usciamo da “Blocco Note”. Ripetiamo la stessa identica cosa con Word, producendo un file di nome “dante.doc” e salvandolo nella stessa cartella del file precedente. Infine, andiamo a vedere nel modo che abbiamo imparato nella sezione precedente, le dimensioni di questi file (vedi Figura 4).
Figura 4: Differenze tra formati di testo
Il file “dante.txt” avrà una dimensione di 35 byte4: infatti, dato che in ASCII ogni carattere viene rappresentato con un byte e nel testo che abbiamo scritto vi sono 35 caratteri (spazi inclusi), i conti tornano subito. La sorpresa avviene quando leggiamo le dimensioni del file “dante.doc”: 19 KB e per la precisione 19,456 byte! Il formato 3
L’estensione .txt viene universalmente utilizzata per indicare che il formato del file è di tipo “testo”, ovvero ASCII. 4 La dimensione in byte del file sarà leggibile solo tramite la finestra delle proprietà (vedi paragrafo 2.2). I dettagli mostrati dall’applicazione “Esplora Risorse” fanno approssimazioni per eccesso. In questo caso 35 byte “diventano” 1KB.
adoperato dall’applicazione Word è infatti estremamente ridondante, poiché vengono memorizzate e gestite molte altre informazioni quali lo stile del paragrafo, la dimensione, il tipo ed il colore dei caratteri, etc. Per avere un’idea della ridondanza di un formato professionale di video scrittura, provate semplicemente a creare un documento word vuoto (senza alcun carattere all’interno). Non stupitevi nell’osservare una dimensione attorno ai 10 KB, come per il file “vuoto.doc” che trovate in Fig. 4! È per questo motivo che si consiglia sempre di utilizzare il formato giusto al momento giusto: se volete spedire una mail ad un amico, nella maggior parte dei casi non avrete bisogno di tutte le caratteristiche di un complesso programma di video scrittura quale Word e farete bene ad utilizzare un normale formato “testo” (ASCII) per evitare di intasargli la casella di posta elettronica (che ha in genere una capacità limitata). Se invece volete scrivere una lettera commerciale o un racconto da proporre ad un editore, potrete avvantaggiarvi delle caratteristiche di un programma di video scrittura. Esercizio: provare ad aprire un file word con un’applicazione di editing diversa che tratta solo con formato ASCII (es. Blocco Note). Cosa viene visualizzato? E perché, secondo voi? 3.2
Esempio: Scelta della codifica di visualizzazione da Browser Web
Un discorso simile, vale per il formato standard delle pagine Web, ovvero HTML. L’HTML è un linguaggio di formattazione testi. Un file html è in formato ASCII e contiene una serie di tag (ovvero delle sequenze speciali di caratteri che permettono la marcatura del testo) che vengono elaborati dal browser allo scopo di visualizzare “in bella” la pagina pubblicata sul Web. Ad esempio, per visualizzare la frase:
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
7
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
Il medium è il messaggio e volendo mantenere lo stile indicato, bisognerà scrivere:
Il medium è messaggio
venga “perso per strada”. Ad esempio, a secondo di quale codifica venga scelta, potremmo leggere la frase precedente in questo modo: Il medium
il
In questo modo allineeremo il testo al centro (tag ), lo scriveremo in grassetto (tag ) ed in corsivo (tag ). Inoltre, dato che il carattere “è” non è presente nella codifica ASCII standard, viene utilizzata la sequenza è che il browser web riconoscerà e visualizzerà secondo una codifica opportuna (ad esempio, tramite la UNICODE che contiene i caratteri accentati). Attenzione però a non cambiare codifica di visualizzazione (vedi MS Internet Explorer in Figura 5). Se tale codifica di visualizzazione viene cambiata, tutte le associazioni tra sequenze binarie e simboli cambieranno e non è affatto raro che qualche carattere
il messaggio
poiché il codice relativo al carattere “è” non viene utilizzato nella codifica scelta. Anche in questo caso sorge spontaneo un consiglio: quando si scrivono delle mail e si utilizza il formato testo standard, dato che non si conosce la codifica che il gestore della posta del ricevente utilizzerà, è bene evitare caratteri non ASCII. Quando si vorrà scrivere un carattere accentato, utilizzate il carattere desiderato seguito da un apostrofo (ad esempio: perche’, pero’, piu’, etc.). Il problema non si pone se state scrivendo una mail in inglese: non esistono caratteri di quel tipo e l’ASCII è stato fatto su misura dell’alfabeto e della sintassi usati nella lingua anglosassone.
Figura 5: codifiche di visualizzazione di un browser Web
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
8
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
4. Rappresentazione dei numeri Nel paragrafo precedente abbiamo visto come codificare testi composti da stringhe, ovvero sequenze di caratteri alfanumerici. Se scriviamo un file di testo in cui scriviamo la frase: “il numero di telefono del Rag. Fantozzi 171717”, è ovvio che la stringa “171717” viene interpretata come parte del testo è nessuno la utilizzerà mai come valore numerico, sommandola – ad esempio – ad altri numeri, o moltiplicandola con un altro fattore. In questo caso, stiamo utilizzando i numeri in quanto simboli e non in quanto valori. Notare infatti che la tabella ASCII, prevede dei codici da associare ai caratteri “0”, “1”, “2”, …, “9”: ad esempio, lo “0” è rappresentato dalla sequenza: 00110000. Se la nostra intenzione è di scrivere un testo, questa codifica và più che bene. Ma supponiamo di voler utilizzare i numeri in quanto valori e non in quanto simboli. Questo è essenziale quando utilizziamo un programma che compie dei calcoli matematici (per esempio fogli elettronici, calcolatrici, etc.).
quando parleremo dell’Hardware, un calcolo come questo è compiuto dalla CPU, che prende il primo valore in formato binario e lo somma (utilizzando le normalissime regole aritmetiche) al secondo valore – sempre in formato binario. Quindi, conserva il risultato che può essere restituito in output. In particolare, cerchiamo di eseguire questa banale operazione utilizzando il codice ASCII. Traduciamo i singoli numeri nel modo che abbiamo già appreso, notando che il 3 ha codice 00110011, il 2 ha codice 00110010 (di conseguenza 32 nasce dalla concatenazione delle due sequenze) e l’8 ha codice 00111000. Facciamo la somma, così come la farebbe un’ipotetica CPU: 0011001100110010 + 0000000000111000 = 0011001101101010 Osservazione 1: anche se a molti può sembrare punico antico, la somma tra numeri binari è molto più semplice di quella tra numeri in base decimale: basta seguire le stesse vecchie regole avendo a disposizione solo due cifre anziché dieci. Ricordarsi quindi di fare il riporto nella colonna di sinistra quando la somma tra due o più cifre restituisce un numero maggiore o uguale a 2 e non 10 come per la numerazione decimale; per esempio, 1 + 1 = 0 e riporto di 1. Osservazione 2: abbiamo aggiunto del padding (sequenze di zero che servono a riempire dei “buchi”) al secondo valore dato per arrivare a 16 bit e per poter effettuare la somma.
Figura 6: il programma “calcolatrice” tra gli accessori di Windows
Vediamo cosa succede quando utilizziamo il programma “Calcolatrice” (Figura 6) quando compiamo una semplice somma: 32 + 8. Come vedremo
Il risultato è composto da due “caratteri”: 00110011 e 01101010 che in ASCII corrispondono rispettivamente al carattere “3” ed al carattere “ “ (spazio). Quindi, il risultato “3 “ è qualcosa che non è neanche un numero! Questo è un semplice esempio per fare immediatamente capire come un formato
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
9
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
che funziona perfettamente in un contesto, può essere assolutamente inutile in un altro. Quando si vuole che i numeri si comportino come valori, il codice da usare è un altro e si rifà più direttamente alle leggi di conversione dei numeri con basi differenti. Di seguito riprenderemo le queste leggi di conversione, partendo dall’osservazione che tutti i numeri in una base qualsiasi b possono essere espressi utilizzando un sistema comune. 4.1 Il sistema posizionale
di
numerazione
Tutti i numeri in base 10 – quelli a cui siamo più affezionati in quanto esseri umani – possono essere espressi nel termini delle unità, decine, centinaia, migliaia (…) che li compongono. Ad esempio, il numero 221 è composto da 2 centinaia, 2 decine ed 1 unità. Formalmente, utilizzando le potenze del 10, possiamo esprimere lo stesso numero in questo modo: 221 = 2x102 + 2x101 + 1x100 Questa notazione è detta esplicita o anche posizionale: ogni numero si esprime come la somma di ciascuna cifra per la base elevata all’esponente che rappresenta la posizione della cifra. La notazione posizionale può essere usata con qualunque base creando così differenti sistemi di numerazione. È importante però capire che per ogni base di numerazione si utilizzano un numero di cifre uguale alla base. Ad esempio per numeri in base 2, utilizzeremo solo due cifre e, per l’esattezza, 0 ed 1; per numeri in base 10, utilizzeremo invece dieci cifre: 0, 1, 2, 3, …, 9. In informatica, oltre alla base binaria si utilizzano spesso anche numerazioni ottali ed esadecimali. La differenza principale è nel numero di cifre che abbiamo a disposizione per rappresentare valori numerici. Utilizzando numerazioni ottali, abbiamo 8 cifre in tutto, comprese tra 0 e 7, mentre se
utilizziamo una numerazione esadecimale ne abbiamo 16 (0, …, 9, A, B, C, D, E, F). Questo può sembrare molto complesso, ma fortunatamente, quanto detto per la notazione posizionale nel caso della numerazione decimale, vale per tutte le altre numerazioni. Di seguito presentiamo alcuni esempi, esplicitando la base della numerazione adottata utilizzando un pedice accanto al numero (es. 1001 in base 2 è rappresentato come 10012). 10012 = 1x23 + 0x22 + 0x21 + 1x20 5348 = 5x82 + 3x81 + 4x80 B7FC16 = 11x163 + 7x162 + 15x161 + 12x160 Una volta individuata una notazione comune, siamo in grado di presentare un semplice metodo di conversione di numeri in basi diverse. 4.2 Conversione da una base qualsiasi a base 10 Per prima cosa, “umanizziamo” i valori espressi secondo le numerazioni binarie, ottali e decimali. La buona notizia è che, una volta espresso il valore nella sua notazione posizionale, il gioco è fatto: basta calcolare la somma data per ottenere il valore equivalente in base decimale. Riprendendo gli esempi fatti prima, avremo: 10012 = 1x23 + 0x22 + 0x21 + 1x20 = 910 5348 = 5x82 + 3x81 + 4x80 = 34810 B7FC16 = 11x163 + 7x162 + 15x161 + 12x160 = 4710010 Esercizio 1: Convertire in base decimale i seguenti numeri: 10012 – 111111112 – 7108 – A5116 Esercizio 2: Sapresti discriminare ad occhio e senza fare calcoli tra i seguenti numeri espressi in base binaria quelli pari da quelli dispari? 10012 –10002 –1112 –1002 –1110010002
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
10
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
4.3 Conversione da base 10 ad una base qualsiasi Da un punto di vista concettuale, la conversione da base 10 ad una base n qualsiasi (2, 8, 16, …) è ancora più semplice: occorre trovare tutti i resti delle successive divisioni del numero per la base n. Facciamo un esempio: convertiamo in base 2 il numero 210. Per prima cosa, dividiamo 210 per 2. Otteniamo il valore 105 con resto 0. Mettiamo da parte il resto trovato e ripetiamo la stessa operazione per il numero 105. Avremo la seguente successione di passi: 210:2 = 105 con resto 0 105:2 = 52 con resto 1 52:2 = 26 con resto 0 26:2 = 13 con resto 0 13:2 = 6 con resto 1 6:2 = 3 con resto 0 3:2 = 1 con resto 1 1:2 = 0 con resto 1 A questo punto ci fermiamo, e prendiamo la sequenza di resti che abbiamo trovato, partendo dall’ultimo fino al primo (ecco il perché di quella freccia dal basso verso l’alto). Otteniamo il valore in base 2: 110100102 Esercizio 1: convertire il numero 110100102 in base 10 e verificare che esso sia uguale a 210. Esercizio 2: convertire il numero 21010 prima in base otto e poi in base 16 (suggerimento: basta fare divisioni per 8 e per 16 rispettivamente). A questo punto, possiamo risolvere il problema che ci siamo posti all’inizio del paragrafo, ovvero simulare l’operazione che la CPU del nostro computer effettuerà per sommare i numeri 32 ed 8.
Intanto convertiamo questi valori secondo la numerazione binaria: 3210 = 1000002 810 = 10002 Quindi, facciamo la somma: 100000 + 001000 = 101000 ( = 4010) Finalmente, i conti tornano! 4.4 Numero fisso di cifre e problemi di overflow Prima di cantare definitivamente vittoria, bisogna fare alcune considerazioni relative ai vincoli tecnologici dei computer: si può sempre e soltanto rappresentare un numero limitato, per quanto grande, di cifre binarie. Questo implica che non possiamo rappresentare numeri di qualsiasi dimensione e dobbiamo arrenderci al fatto che, per qualsiasi tipo di codifica numerica, esiste un limite massimo di valori rappresentabili. Per ogni numero dobbiamo assegnare un numero fisso di cifre binarie e quindi il limite massimo di valori rappresentabili dipende da questo numero fisso. Su tutti i computer, i numeri vengono rappresentati prevalentemente tramite 16 bit (2 byte) e/o tramite 32 bit (4 byte). In alcuni casi si può arrivare anche ad 8 byte e più a seconda del tipo di microprocessore. Un’altra importante osservazione riguarda il tipo di numero: finora abbiamo visto una codifica possibile per numeri interi senza segno. Ma se dovessimo usare numeri negativi? Oppure numeri reali, cioè numeri con la virgola che tra l’altro possono essere positivi o negativi? Ebbene, è chiaro che per ogni categoria esiste una differente rappresentazione,
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
11
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
ma un approfondimento in tal senso è al di là dello scopo di queste pagine. Invece vale la pena soffermarsi qualche minuto in più sul limite massimo rappresentabile con un numero n di cifre binarie usando la codifica numerica per interi positivi spiegata prima. Come abbiamo visto nella Sezione 3, tale limite è dato dal valore 2n. Quindi, con un byte (8 bit) possiamo rappresentare 28 = 256 valori diversi, mentre con due byte ne rappresentiamo 216 = 65.536. Ma quali numeri sono rappresentabili? Ovviamente i valori sono tutti quelli compresi tra: 0 e 2n – 1 Ad esempio, se usiamo 8 bit, il valore massimo che possiamo rappresentare è 255 (il minimo, chiaramente, è 0). Questo limite rappresenta un problema nel caso in cui un’operazione tra due e più valori generi un nuovo valore al di fuori di quell’intervallo (o, in inglese, range). Supponiamo ad esempio di usare solo un byte per rappresentare interi positivi e di dover fare la somma 251 + 6: 11111011 + 00000110 = 100000001
sempre tenere presente il fatto che anche questo tipo di rappresentazione possiede dei limiti.
5. Rappresentazione delle immagini Sappiamo bene che i testi ed i numeri non sono gli unici tipi di dati che è possibile gestire con il proprio computer. Le applicazioni multimediali usano ed elaborano informazioni relative ad immagini, suoni e filmati5. In questa sezione ci occuperemo di esporre le tecniche alla base della memorizzazione e dell’elaborazione di un’immagine. Partiamo dal caso più semplice, ovvero un’immagine in bianco e nero, senza ombreggiature ne livelli di chiaroscuro. 5.1 Immagini in bianco e nero Supponiamo di rappresentare l’immagine di un cerchio.
(1 byte) (1 byte) (1 byte + 1 bit)
Ovvero 257… che ha bisogno di ben nove cifre decimali per essere rappresentato. Purtroppo il nostro ipotetico computer riesce a memorizzare solo 8 cifre per ogni numero intero, quindi memorizzerebbe soltanto 8 delle 9 cifre binarie, generando un errore. Tale errore è chiamato overflow (lett. straripamento). Un’osservazione finale: quando si usano le rappresentazioni dei numeri reali (a virgola mobile, ovvero floating point), è possibile rappresentare con un maggior grado di finezza i valori numerici: possiamo rappresentare valori più grandi (usando notazione esponenziale) e anche valori molto piccoli (esponente negativo), con lo stesso stratagemma. Ma bisogna
(a)
(b)
Figura 7: un cerchio (a) e lo stesso cerchio in una griglia 10x9 (b)
In Figura 7 vediamo un normalissimo cerchio (a) e lo stesso cerchio rappresentato in una griglia 10x9, 5
Sembra che l’olfatto sia il senso più trascurato dalle arti e dalla tecnologia informatica (ma non dall’industria dei profumi…). Eppure esistono ricerche sulla riproduzione degli odori durante l’esplorazione di mondi virtuali e la navigazione in rete. Bisogna essere dotati di apparecchiature complesse e molto dispendiose, ma la via è possibile. Cercare in Internet per credere!
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
12
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
costituita da righe orizzontali e verticali a distanza costante. La rappresentazione digitale di questa immagine, trae spunto dalla stessa tecnica di stampo scolastico che i disegnatori usano per riprodurre delle figure rispettandone le proporzioni. Si vuole rappresentare (memorizzare) ogni singolo quadrato dell’immagine separatamente, per poi poter visualizzare il risultato complessivo. Ogni quadrato prende il nome di pixel (picture element) e viene codificato in binario secondo la seguente convenzione (pensare al fatto che per ora stiamo rappresentando solo due colori): - La cifra 0 viene utilizzata per la codifica di un pixel corrispondente ad un quadrato il cui bianco è predominante; - La cifra 1 viene utilizzata per la codifica di un pixel corrispondente ad un quadrato il cui nero è predominante. Inoltre, ordiniamo per comodità la griglia dei pixel dall’alto verso il basso e da sinistra verso destra. Questo significa che, per l’esempio di cui sopra, otterremmo una rappresentazione di questo tipo: 0 0 0 0 1 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 0 0
Quindi, la figura sarà rappresentata dalla stringa binaria: 000011000000011110000011111100011 111111011111111110111111110001111 110000011110000000110000 Notiamo però che riconvertendo questa stringa binaria in un’immagine sostituendo allo zero un pixel bianco e all’uno un pixel nero, otterremmo il
disegno seguente, riportato anche in Figura 8(a): 0 0 0 0 1 0 0 0 0
0 0 0 1 1 1 0 0 0
0 0 1 1 1 1 1 0 0
0 1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 1 0
0 0 1 1 1 1 1 0 0
0 0 0 1 1 1 0 0 0
0 0 0 0 1 0 0 0 0
È chiaro che abbiamo perso in qualità. La digitalizzazione comporta sempre perdita di qualità, anche se in pratica è possibile migliorare la granularità della rappresentazione ed utilizzare altre tecniche (ad esempio, sfumature con diverse gradazioni di grigio) per “ingannare” maggiormente l’occhio dell’utente finale e fare “sparire” l’effetto a scalini tipico delle visualizzazioni tramite pixel. Esattamente come per la qualità di uno schermo video, un’immagine viene caratterizzata da una risoluzione e da una profondità. La risoluzione dell’immagine è il numero di pixel che la costituiscono, espressi in termini di larghezza x altezza. Ovviamente, aumentando il numero di pixel a disposizione, migliora la qualità dell’immagine (vedi Figura 8). La profondità dell’immagine è invece il numero di bit che servono per rappresentare un singolo pixel dell’immagine. In questa sezione abbiamo solo immagini a due colori (bianco e nero) e quindi è stato sufficiente avere un solo bit associato ad ogni pixel. Praticamente, la profondità dell’immagine è sempre legata al numero di colori rappresentabili. Quando conosciamo la profondità, possiamo sempre risalire al numero di colori presenti nell’immagine. Esempio: Negli esempi visti, la profondità è uguale a 1. Infatti, 21 = 2 colori.
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
13
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
(a)
(b)
(c)
(d)
Dal bianco e nero passiamo a diverse gradazioni di grigio. La logica è sempre la stessa: ad ogni sfumatura (o colore) associamo una diversa sequenza di bit. Nel caso già visto avevamo solo due colori: è stato possibile rappresentare un pixel con un solo bit. Se invece vogliamo rappresentare, ad esempio, 16 livelli di grigio, abbiamo bisogno di almeno 4 bit; infatti, 24 = 16. Con 8 bit possiamo distinguere 256 diversi livelli di grigio. Ovviamente, niente ci vieta di rappresentare diversi tipi di colori, invece che limitarci a distinguere tra varie sfumature di grigio. Pensandoci sopra, questo è proprio il processo che utilizza un pittore quando usa una tavolozza di colori: mette a propria disposizione un certo numero di campioni di colori, dai quali attinge tramite il suo pennello ogni volta che ne ha bisogno. Chiaramente, il numero di colori a disposizione del nostro pittore ideale è limitato: sono comuni palette (tavolozze) a 256 colori (i.e. profondità dell’immagine a 8 bit). Quando abbiamo bisogno di colori che non sono presenti in questa tavolozza, possiamo o sostituire il colore mancante con quello più simile presente nella palette, oppure cambiare palette. In questo modo, cambia l’associazione tra sequenze di bit e colori. Di conseguenza, quando si usa un programma di
Figura 8: Lo stesso cerchio in risoluzioni diverse: (a) 10x9 (b) 29x28 (c) 58x56 (d) 116x108
Nel resto della sezione vedremo come rappresentare immagini a più colori. Per ora fermiamoci ad osservare come dalla risoluzione e dalla profondità riusciamo a risalire alla dimensione di un’immagine. Infatti, se moltiplichiamo il numero di pixel presenti in un’immagine per la sua profondità, otteniamo la quantità di bit necessaria per rappresentare l’immagine. Esercizio: considerate le immagini in Figura 8, dire quanti byte occupano. 5.2 Gradazioni di grigio e tavolozze di colori (palette)
(a)
(b)
(c)
Figura 9: tre diversi esempi di palette a 256 colori
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
14
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
elaborazione dell’immagine (es. paint shop pro, photoshop, etc.), bisogna specificare quale palette si sta usando. In Figura 9 vediamo tre diversi esempi di palette a 256 colori. Ad esempio, la palette (a) è composta da 256 diverse sfumature di azzurro: ci potrebbe servire per tingere un cielo verosimile. La rappresentazione di un’immagine tramite associazione di una sequenza di bit ad ogni pixel è chiamata codifica bitmap o anche raster. Esercizio 1: Data un’immagine bitmap con risoluzione 200x80 e composta di 256 colori, quanti byte occuperà? Esercizio 2: Supponiamo di avere palette con soli 64 colori. Quanti occuperà un’immagine bitmap risoluzione 150x100 che utilizza palette?
una byte con tale
Esistono altri modelli di rappresentazione, come il CMY, il quale è un modello sottrattivo ed è basato sui colori Ciano, Magenta e Giallo. CMY è usato dalle stampanti, ma per ora concentriamoci sul modello RGB, il quale può essere pensato composto da tre canali, ognuno rappresentante una scala di valori luminosi del Rosso, del Verde e del Blu. La combinazione di questi canali produce una ampia varietà di colori appartenenti allo spettro visibile. In sintesi, invece che rappresentare alcune sfumature di tanti colori diversi, possiamo rappresentare molte sfumature dei tre colori primari: dalla combinazione di essi otteniamo tanti altri colori. Esempi: - Rosso + Blu = Viola - Blu + Verde = Azzurro - Rosso + Verde = Giallo - Blu + Rosso + Giallo = Bianco
5.3 Codifica RGB e qualità fotografica Dalla sezione precedente appare subito chiaro che, per rappresentare contemporaneamente più di 256 colori per immagine, dobbiamo utilizzare palette più grandi. Aumentare il numero di sfumature in un’immagine digitalizzata è di primaria importanza se si vuole qualità fotografica: abbiamo bisogno di milioni di colori! Nello stesso tempo, le palette non forniscono una rappresentazione dei colori “assoluta”: basta cambiare palette, per ottenere dei colori diversi. Sia per ingrandire l’insieme dei colori a nostra disposizione che per usare una modalità di rappresentazione assoluta, si usa la codifica RGB (Red, Green, Blu – Rosso, Verde, Blu ovvero i tre colori primari). RGB è un modello additivo di rappresentazione dei colori che viene usato dai dispositivi basati sull’emissione della luce, come ad esempio i video CRT o a raggi catodici. Questo significa che se tre emissioni luminose di rosso, verde e blu vengono sommate tra di loro, è possibile produrre qualsiasi altro colore.
Osservazioni: - se rappresentiamo ogni colore primario con 2 bit, otteniamo 4 gradazioni diverse (22 = 4). Questo significa che abbiamo 4 rossi, 4 verdi e 4 blu. Combinando tutte le possibilità abbiamo 4x4x4=64 colori diversi. Ogni pixel sarà rappresentato da circa un byte (profondità a 6 bit = 2+2+2). - utilizzando 4 bit per colore primario, otteniamo 16 diverse gradazioni, ovvero 4096 colori diversi. In questo caso un pixel richiede circa due byte di informazione (profondità a 12 bit). - utilizzando 8 bit per colore primario, otteniamo 256 diverse gradazioni, ovvero circa 16,8 milioni colori diversi. In questo caso un pixel richiede tre byte di informazione (profondità a 24 bit). In Figura 12, vediamo l’editor dei colori di un comune programma di manipolazione immagini: Microsoft Imaging. Osserviamo che una determinata sfumatura di azzurro è rappresentata da una particolare
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
15
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
combinazione di rosso, verde e blu (vedi riquadro in basso a destra in figura). Le sequenze di bit relative ad ogni colore primario sono espresse in base decimale: 139 (R), 210 (G) e 216 (B). Tutti e tre i numeri sono compresi tra 0 e 255, quindi ogni sfumatura del colore primario è rappresentabile tramite un byte.
Figura 10: codifica RGB di un colore
Spesso, tale codifica è espressa in base esadecimale. In questo modo, lo stesso colore dell’esempio sarebbe espresso nel modo seguente: 8B D2 D8 (8B16 = 13910, e così via…). I professionisti di elaborazioni di immagini, trovano la codifica esadecimale più sintetica: infatti rappresentiamo un colore (e, di conseguenza, il contenuto di tre byte, tramite 6 caratteri alfanumerici). In HTML, ad esempio, i colori vengono espressi in questo modo anteponendo un simbolo # al codice. Per usare il colore di Figura 12 in una pagina da pubblicare sul Web, basterà riportare il codice #8BD2D8 nel tag HTML opportuno. Esempio: per cambiare il colore dello sfondo di una pagina Web si usa l’attributo BGCOLOR (background color) nel tag . Infatti, per usare lo stesso azzurro della Figura 12, useremo il seguente codice:
Esercizio 1: che colore corrisponde alla codifica HTML #000000? E a #FFFFFF? Esercizio 2: creare una pagina HTML con lo sfondo rosso puro. 5.4 Palette e codifica RGB A questo punto conviene chiarire subito il rapporto che lega la codifica RGB ed i colori di una palette: ebbene, quando utilizziamo una determinata tavolozza, ogni singolo colore è rappresentato in RGB. Le informazioni relative alla palette (che vengono conservate in una tabella dove ogni cella contiene la codifica RGB di un dato colore), vengono memorizzate insieme all’immagine. In verità, le palette nascono da una semplice osservazione: ci sono molti casi in cui non abbiamo bisogno di avere a disposizione 16,8 milioni di colori, ma ce ne bastano molti meno. Fatta questa considerazione, ci chiediamo se possiamo risparmiare occupazione di memoria in questi casi. Osservazione: sono comuni palette a 256 colori (profondità dell’immagine a 8 bit). La palette viene memorizzata insieme al resto dei dati dell’immagine. Se avessimo un’immagine di 640x480, sarebbero necessari 8 bit per la codifica di ciascun pixel; la codifica richiederà 2457600 bit (307200 byte) per l’immagine più 256*3=768 byte per la palette. Quanti byte sarebbero necessari per memorizzare la stessa immagine usando codifica RGB senza palette? Se vogliamo cambiare palette ad un’immagine bitmap, dobbiamo però stare molto attenti: potremmo ottenere l’effetto indesiderato di cambiare tutti i colori in una sola volta! Per capire il problema, osserviamo l’immagine in Figura 10.
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
16
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
Figura 11: un'immagine con colori realistici
Questa bitmap usa una sua propria palette di colori che viene salvata insieme al resto dei dati dell’immagine. In questo modo riusciamo ad associare ai vari pixel tanti colori diversi, dalle varie sfumature del pendente fino a quelle del dito e dello smalto per unghie. In Figura 11 invece vediamo cosa succede se, tramite un’applicazione per l’editing di immagini, cambiamo la palette in quella mostrata in Figura 9(a).
colori rappresentati ed occuperà in tutto 24x4 = 96 bit. Supponiamo ora di rappresentare un’immagine con risoluzione 3x2 utilizzando questa palette. L’immagine è la seguente:
Possiamo rappresentare l’immagine dando, pixel per pixel, la codifica in binario della posizione nella palette del colore appropriato: 00 01 01 10 11 11
Figura 12: la stessa immagine con un'altra palette.
Abbiamo tutti gli strumenti che ci permettono di capire questo fenomeno (frequentissimo, tra le altre cose e spesso involontario). Per capirlo meglio, semplifichiamo i termini del problema, pensando di avere a che fare con un’immagine a quattro colori (profondità 2 bit). Avremo una palette con questi quattro colori. Per la precisione: 0 1 2 3
81 12 D4
Il file contenente l’immagine sarà quindi costituito dalla tabella (96 bit) e dai precedenti dati dell’immagine (2x3x2=12 bit), per un totale di 108 bit. Osservazione: Se non avessimo usato la palette, ma direttamente la codifica RGB, avremmo dovuto conservare per ogni pixel i 24 bit relativi alla rappresentazione del colore corrispondente, per un totale di 24x3x2 = 144 bit! Ma cosa succede se teniamo i dati relativi all’immagine e cambiamo la palette? Semplicemente cambia l’associazione pixel/colore. Ad esempio, supponiamo di avere la seguente palette:
44 D6 D5
0
3E 52 18
1
1B BC AA
Nella prima colonna della tabella, mostriamo il colore ed il numero della riga associato ad esso, nella seconda abbiamo dato la rappresentazione RGB (espressa in valori esadecimali) del colore corrispondente. La palette che memorizzeremo conterrà i codici RGB dei
2 3
81 00 D4 44 00 D5 3E 00 18 1B 00 AA
La stessa immagine, verrebbe visualizzata nel modo seguente:
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
17
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
5.5 Codifiche di compressione e grafica vettoriale Finora abbiamo parlato in termini generali di codifiche bitmap, delle quali esistono numerose varianti (palette, RGB, etc.). Per ogni tipo di codifica, esistono numerosi formati, che variano da piattaforma a piattaforma. Esiste un altro tipo di approccio alla rappresentazione delle immagini, che prende il nome di codifica vettoriale. Abbiamo anche codifiche ibride, che sono costituite in parte da bitmap ed in parte da immagini vettoriali. In questa sezione, concluderemo il nostro discorso sulla rappresentazione delle immagini parlando della differenza tra i vari formati. Come abbiamo visto, la grafica bitmap è caratterizzata dal fatto che ogni punto (pixel) rappresenta un’informazione differente. In particolare, l’informazione che conserviamo per ogni punto è la sua gradazione del colore. Ogni pixel è quindi associato ad un numero di bit che esprime la codifica di quel colore. È facile risalire alla dimensione dell’immagine a partire dalla risoluzione e dalla dimensione della singola informazione (o, come abbiamo detto, profondità dell’immagine): basta calcolare il numero di punti complessivo per la dimensione dell’informazione. Esempio: un’immagine bitmap di 100x200 pixel con 16 bit per ogni pixel occupa 20000*16 bit, ovvero circa 40 KB. Esercizio: creare un’immagine bitmap utilizzando un programma di grafica (paint shop pro, photoshop, etc.) e poi salvarla nei formati bmp e pbm (portable bitmap). Aprire i file ottenuti con un normale editor di testo e vedere il formato grezzo. Cosa contiene? Perché? (Attenzione, specificare in fase di salvataggio di usare un formato ASCII e non BINARY in modo da poter visualizzare i dati con un editor testuale.)
Purtroppo, tale codifica è estremamente costosa (in termini di occupazione di spazio di memoria): più la qualità dell’immagine è alta, maggiore è lo spazio occupato da essa. Per risolvere questo problema, si usano opportune codifiche di compressione, tra cui ricordiamo le più famose: la CompuServe Graphic Interface (GIF) e quella proposta dal Joint Photographic Experts Group (JPEG). I file che usano tali codifiche riportano rispettivamente le estensioni .gif e .jpg (o anche .jpeg). I programmi che trattano con i formati di compressione sono detti codec: (compression/decompression), usano un sistema per comprimere l’informazione prima di memorizzarla e per decomprimerla prima di visualizzarla. La codifica GIF tende ad eliminare i pixel ripetitivi, ed utilizza uno schema a palette (creando una tavolozza dei colori ad hoc che viene memorizzata insieme agli altri dati e che contiene le sfumature più frequenti e più vicine ai colori dell’immagine di partenza). Le tavolozze utilizzabili dalla codifica GIF possono rappresentare massimo 256 colori. Invece la codifica JPEG consente l’uso di uno schema RGB, ma contrariamente alla GIF, è una compressione con perdita di informazione: viene persa una certa precisione rispetto all’immagine di partenza, effettuando un compromesso rispetto alla dimensione finale. Tale perdita non può essere recuperata in alcun modo. La codifica JPEG consente di manipolare tale fattore di compressione. Il formato vettoriale segue un approccio completamente diverso: l’attenzione non viene concentrata sui singoli punti, quanto piuttosto sugli elementi geometrici primitivi, i quali vengono specificati individualmente. In pratica, piuttosto che rappresentare la figura punto per punto, si cerca di definirne le curve che la compongono e quindi memorizzare solo le coordinate che servono a ricostruire le curve rintracciate: la visualizzazione avverrà
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
18
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
solo dopo che, lette le coordinate memorizzate, una parte del programma riprodurrà pixel per pixel le curve che compongono la figura originale. In questo modo è possibile spesso risparmiare occupazione di memoria, in cambio di un maggior lavoro di calcolo da parte della macchina, in modo da poter ricostruire il disegno originale. Ad esempio, si veda il disegno riportato in Figura 13. (0,0) (10,10) 50 px
Figura 13: un quadrato con lato lungo 50 pixel.
Per memorizzare le informazioni sufficienti per rappresentare il quadrato riportato in figura, dobbiamo essenzialmente individuare un punto di riferimento (che può essere il vertice in alto a sinistra del quadrato) e la lunghezza del lato. Tramite queste misure possiamo risalire in qualsiasi momento al disegno riportato in figura. Consideriamo il vertice in alto a sinistra come l’origine di ipotetiche assi cartesiane, il senso crescente delle ascisse da sinistra verso destra ed il senso crescente delle ordinate dall’alto verso il basso6. Se usiamo una rappresentazione che usa il termine: Rectangle (x, y, w, h) per memorizzare i dati di un rettangolo generico con vertice principale di coordinate (x, y), base w e altezza h, allora il file dell’immagine di Figura 13, conterrebbe essenzialmente la sequenza di caratteri: Rectangle(10,10, 50, 50). Si potrebbe salvare questo file direttamente in formato testo (es. ASCII) 6
In computer graphic, l’origine delle assi cartesiane viene spesso individuato come il vertice in alto a sinistra della nostra “lavagna” e non quello in basso a sinistra cui siamo normalmente abituati.
risparmiando molto spazio. Se dovessimo salvare i dati di questo disegno, dovremmo memorizzare solo la stringa riportata. Esercizio: se l’immagine di Figura 13 fosse in risoluzione 100x100, quanto spazio occuperebbe nel formato vettoriale usato nell’esempio (considerando solo la specifica Rectangle)? E quanto spazio occuperebbe se invece venisse usato un formato bitmap a due colori? Osservazione: è chiaro che in un file in formato vettoriale bisognerebbe memorizzare opportunamente anche la risoluzione dell’immagine, lo spessore in pixel delle linee, i colori delle linee e dei riempimenti delle figure, etc. Un approfondimento della codifica vettoriale in tal senso è al di fuori degli scopi di queste pagine. Esempi di formati vettoriali sono i grafici usati da programmi tipo CAD e le Clip Art. La grafica Web usa abbondantemente la grafica vettoriale: ad esempio abbiamo SVG (Scalable Vector Graphic), lo standard definito dal W3C consortium e Shockwave Flash della Macromedia che consentono la gestione di animazioni in formato vettoriale. A favore del formato vettoriale c’è il notevole risparmio dello spazio di memoria quando è possibile individuare facilmente gli elementi grafici primitivi che compongono l’immagine. È chiaro però che tale vantaggio non esiste nel caso in cui si volesse riprodurre un’immagine in qualità fotografica: l’insieme di curve e di linee sarebbe così numeroso che alla fine converrebbe rappresentare l’immagine pixel per pixel. Inoltre, il lavoro di calcolo della macchina per ricostruire l’immagine a partire dalle coordinate di tantissime linee rallenta il processo di elaborazione. Un altro importante vantaggio della grafica vettoriale, consiste nel non perdere in qualità quando essa viene ingrandita tramite operazioni di zoom: la macchina calcolerà le nuove proporzioni
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
19
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
e disegnerà correttamente il disegno, senza i soliti effetti a scalini caratteristici delle bitmap. Infine, esistono codifiche ibride: una parte del documento è memorizzata in formato bitmap, un’altra parte in formato vettoriale. Tali codifiche sono comuni nei formati di interscambio di documenti che contengono testo (vettoriale) ed immagini (bitmap): gli esempi sono il formato PostScript (utilizzato anche per migliorare la qualità di stampa) e il PDF (Portable Document Format) ormai uno standard per la distribuzione dei documenti.
otteniamo la rappresentazione analogica dell’informazione sonora. Nel caso della rappresentazione digitale, dobbiamo sempre tenere presente che non possiamo avere a che fare con infiniti punti (le curve relative alle onde sonore sono infatti costituite da un numero infinito di punti), ma solo con un numero discreto di informazioni. È per questo necessario effettuare dei campionamenti dell’onda, ovvero misurare il valore dell’onda a intervalli costanti di tempo (Figura 15).
6. Rappresentazione del suono Un suono rappresenta una variazione della pressione dell’aria che può essere trasformata in un segnale elettrico.
Figura 15: campionamenti dell'onda sonora.
Figura 14: il suono come variazione della pressione dell’aria nel tempo.
Questo infatti è quello che succede all’interno dell’orecchio umano: la variazione della pressione dell’aria esercita un’azione sul nostro timpano, il quale trasmette quest’informazione al cervello tramite un segnale elettrico. In questo modo avvertiamo la sensazione sonora di un evento circostante. Riusciamo a distinguere un suono dall’altro grazie alle seguenti grandezze fisiche: durata, intensità e variazione nel tempo della pressione dell’aria. Dato che un suono è generato dalle variazioni della pressione dell’aria nel tempo, allora possiamo rappresentare fisicamente un suono tramite un’onda (detta appunto onda sonora – vedi Figura 14). Basta porre sull’asse delle ascisse il tempo e sull’ordinata la variazione della pressione rispetto al suo valore di riferimento. In questo modo
Ogni valore campionato (che sarà un normale valore numerico) potrà essere convertito in formato digitale (Figura 16).
Figura 16: campioni dell'onda, ovvero sequenza di valori numerici facilmente codificabili
In particolare, la digitalizzazione del suono avviene secondo le seguenti fasi: • l’onda sonora viene ricevuta da un microfono il cui compito è quello di trasformare (trasdurre) il segnale in un analogo (che ha lo stesso andamento) segnale elettrico • il valore del segnale elettrico, dopo una serie di operazioni di filtraggio che qui tralasciamo, viene convertito in digitale (cioè, viene associata una configurazione di bit al valore in ingresso) da un
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
20
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
dispositivo elettronico detto Analog to Digital Converter (ADC) Osservazione: La trasmissione delle informazioni sonore avviene in maniera analogica, ad esempio, quando attraverso le “vecchie” linee telefoniche. Infatti, la voce viene tradotta dal microfono della cornetta in un analogo (cioè con lo stesso andamento nel tempo) segnale elettrico. L’altoparlante della cornetta del terminale ricevente effettua la trasduzione da un segnale elettrico ad un analogo segnale sonoro. Al contrario, un suono in formato digitale può essere convertito in formato analogico (cioè, riprodotto) tramite le seguenti fasi: • un dispositivo elettronico detto Digital to Analog Converter (DAC) legge le codifiche digitali e produce un segnale elettrico il cui valore dipende dalla configurazione di bit letta • il segnale elettrico, dopo una serie di operazioni intermedie che qui tralasciamo, viene convertito dagli altoparlanti in un segnale sonoro analogo (che ha lo stesso andamento) al segnale elettrico in ingresso La Figura 17 schematizza le fasi sopra descritte.
Come al solito la digitalizzazione dell’informazione, comporterà una perdita della precisione. Per ottenere un campionamento più efficace e quindi per rendere la rappresentazione dell’informazione sonora più precisa, bisogna agire su due parametri: frequenza di campionamento e granularità della rappresentazione digitale. La frequenza di campionamento determina il numero di campioni che vengono prodotti nell’unità di tempo (un secondo). Intuitivamente, maggiore sarà la frequenza di campionamento, migliore sarà la qualità della rappresentazione digitale del suono considerato. La frequenza è una grandezza che viene espressa in Hertz (numero di cicli al secondo). Esiste una frequenza minima da impiegare per il campionamento che garantisca che la rappresentazione digitale di un suono campionato sia fedele all’originale? La risposta è si: il cosiddetto Teorema di Nyquist dice che la frequenza di campionamento deve essere almeno il doppio della frequenza massima presente nel segnale in ingresso. Esempi: - 4000 Hz (4kHz), cioè la frequenza massima della voce umana (che è un caso particolare di suono), impongono una frequenza minima di campionamento di 8000 campioni al secondo. - Poiché la percezione dell’uomo arriva a segnali di circa 20.000 Hz (20kHz), è sufficiente che il tasso (la frequenza) di campionamento sia fissato a oltre 40.000 campioni al secondo. Il tasso di campionamento dei compact disc è di 44.100 campioni/sec, ed è quindi sufficiente a rappresentare correttamente il segnale audio di partenza. Il secondo parametro riguarda la granularità della rappresentazione
Figura 17: Schema di digitalizzazione del suono e di riproduzione del suono in formato digitale Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
21
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
digitale. Questo elemento riguarda il numero di bit che vengono usati per rappresentare in formato digitale un singolo campione (che, lo ricordiamo, è una misura del valore di tensione elettrica in ingresso al ADC). La gamma delle ampiezze possibili viene divisa in intervalli o regioni: ogni campione assume un valore che cade in una delle regioni. Ad esempio, se l’ampiezza del segnale in ingresso all’ADC varia tra –5 e +5 volt, la gamma totale delle ampiezze è di 10 volt; se la codifica digitale divide la gamma delle ampiezze in 16 regioni, ogni regione sarà ampia 0,625 volt (0,625 = 10/16). Chiaramente, il numero di regioni in cui è suddivisa la gamma delle ampiezze dipende dai bit a disposizione per la codifica. Valori tipici per la lunghezza di una parola binaria nell’audio sono 8 o 16 bit, per un numero di regioni pari a 256 (28) e 65.536 (216), rispettivamente. Aumentando il numero di bit si aumenta la qualità (granularità) della descrizione del segnale. Per meglio comprendere il problema facciamo un esempio: supponiamo che la tensione elettrica in ingresso al ADC vari tra un valore minimo ed un massimo, ad esempio, -5Volt/+5Volt. Se supponiamo di usare un solo bit per rappresentare il valore di un campione allora possiamo associare ad un campione una configurazione di bit secondo la seguente regola Valori di tensione Codifica binaria –5/ 0 0 0/ 5 1 individuando 21 regioni di ampiezza 10/21= 5 volt. Intuitivamente, l’uso di un solo bit dà origine ad una rappresentazione grossolana dei valori campionati dato che, ad esempio, valori molto diversi tra loro quali 0,1 e 4,9 sarebbero rappresentati entrambi da un bit che vale 1. Per aumentare la qualità della
rappresentazione si può aumentare il numero di bit che vengono usati per la codifica dei campioni. Nell’esempio precedente, se usassimo due bit potremmo associare ad un campione una configurazione di bit secondo la seguente regola Valori di tensione –5/ –2,5 –2,5/ 0 0/ 2,5 2,5/ 5
Codifica binaria 00 01 10 11
individuando 22 regioni di ampiezza 10/22= 2,5 volt. Otterremmo come risultato quello, ad esempio, di associare ai valori precedenti (0,1 e 4,9) configurazioni diverse (10 e 11, rispettivamente). Tuttavia, valori distanti come, ad esempio, 4,9 e 2,6 avrebbero la stessa codifica (11). Usando otto bit per campione, secondo la seguente regole, aumenteremmo la accuratezza della descrizione digitale. Valori di tensione –5/ –4,961 –4,961/ –4,922 –4,922/ –4,883 –4,883/ –4,844 –4,844/ –4,805 ... ... 4,805/4,844 4,844/4,883 4,883/4,922 4,922/4,961 4,961/5
Codifica binaria 0000 0000 0000 0001 0000 0010 0000 0011 0000 0100 ... ... 1111 1011 1111 1100 1111 1101 1111 1110 1111 1111
In questo caso, individueremmo 28 regioni di ampiezza 10/28= 0,039 volt. Si evince, quindi, che la che la maggiore qualità della rappresentazione in formato digitale del suono si ottiene al prezzo di una maggiore quantità di informazione da memorizzare. Infatti, per memorizzare x secondi di suono con una frequenza di campionamento di f campioni al secondo che sono codificati usando b bit per campione sono necessari x*f*b bit. Il
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
22
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
numero di bit è dunque proporzionale alla frequenza di campionamento, al numero di bit per campione e, ovviamente, alla durata del suono. Esempio: Se volessimo codificare la voce umana dovremmo: • Campionare il segnale vocale ogni 125 milionesimi di secondo (producendo 8000 campioni al secondo) per un segnale con frequenze inferiori a 4kHz (frequenza massima della voce umana – vedi teorema di Nyquist) • Per ogni campione si usano 8 bit • Per cui, il numero di bit che sarebbero necessari per codificare ogni secondo è pari a: 8000 campioni/sec * 8 bit/campione=64000 bit
Esempio: se volessimo codificare la musica di qualità CD dovremmo: • Usare due registrazioni corrispondenti a due microfoni distinti • Campionare il segnale musicale producendo 44100 campioni al secondo • Per ogni campione si usano 16 bit • Per cui, il numero di bit che sarebbero necessari per codificare ogni secondo è pari a 2 x 44100 campioni/sec bit/campione=1411200 bit
x
Per meglio creare l’illusione del movimento, è opportuno che un certo numero di fotogrammi al secondo vengano riprodotti. La velocità di riproduzione del filmato si misura infatti in fotogrammi al secondo (o frame per second – fps). Una prima idea di codifica dei video digitali potrebbe essere di memorizzare tutti i fotogrammi come delle immagini bitmap indipendenti e poi affidare al software di riproduzione (lettore multimediale) il compito di riprodurre i fotogrammi uno dopo l’altro alla velocità decisa (ad esempio, a 24 fps). Questo tipo di codifica è detta codifica non differenziale ed è estremamente costosa in termini di spazio. Esempio: supponiamo di avere un video di 3 minuti, con risoluzione 200x100 (le risoluzioni digitali televisive o cinematografiche sono di gran lunga maggiori – ad esempio è comune la risoluzione 640x480 = 307.200 px). Consideriamo una profondità del colore a 16 bit ed una velocità di 24 fps. La dimensione di questo video sarebbe di 172 MB circa! (perché?) Di seguito riportiamo le specifiche degli standard di distribuzione broadcast più diffusi: Formato PAL (Phase
16
fps 25
Francia
25
Alternating Line)
SECAM
7. Clip digitali I filmati video possono essere visti come delle generalizzazioni delle immagini; infatti, la parte visuale di un filmato è una sequenza di immagini statiche dette fotogrammi (o frame). Per semplicità, pensiamo alla componente sonora del filmato come ad un canale audio che viene messo in sincrono con il canale video. I dati dei due canali possono essere memorizzati nello stesso file. In questa sezione ci concentreremo solo sul canale video.
Paese Europa
(Sequential Couleur Avec Memoire) NTSC (National Television System Committee)
USA, 23,97 Giappone
Questa tabella, contenente i parametri utilizzati dalle normali trasmissioni TV, è utile anche in fase di cattura (ovvero quando importiamo il video in formato digitale utilizzando una scheda hardware apposita di acquisizione video) e di esportazione del filmato (che può essere su VHS, DV, DVD, Betacam, etc. cioè sia in analogico che in digitale). Infatti, è
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
23
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
importante poter memorizzare tutti i fotogrammi che costituiscono il filmato, ed è quindi opportuno sincronizzarsi sulla velocità di ingresso (o in uscita): ad esempio, se si vuole importare un filmato in formato PAL (25 fps) per poi esportarlo in NTSC (quasi 24 fps), il sistema di elaborazione del video digitale dovrà utilizzare un formato interno opportuno. La codifica differenziale si basa sull’idea di codificare interamente solo alcuni fotogrammi. Tali fotogrammi sono detti di riferimento (reference frame). Gli altri fotogrammi vengono memorizzati solo in parte, ed in particolare solo in quelle parti che differiscono dai fotogrammi di riferimento adiacenti. Per trovare un esempio semplice di questo discorso, basta pensare alla ripresa di uno speaker di un telegiornale: lo sfondo, il vestito, la scrivania non cambiano molto tra un fotogramma ed un altro (se non per qualche sfumatura o effetto luminoso): i fotogrammi successivi al primo di una sequenza possono contenere essenzialmente le informazioni relative al viso del conduttore e poco altro. Lo standard di compressione differenziale più importante per i video digitali è MPEG (Movie Picture Experts Group). Le estensioni che indicano questo tipo di file sono .mpg (o anche .mpeg) ed esistono tre diversi standard appartenenti a questo gruppo: MPEG-1, MPEG-2 ed MPEG-4. Lo standard MPEG non si deve confondere con la codifica Motion JPEG, che non è differenziale e memorizza ogni fotogramma come una normale immagine JPEG. Osservazione: I DVD usano una variazione dello standard MPEG-2 per comprimere i dati audio-video. Sono comuni anche i termini di compressione spaziale e compressione temporale. La compressione spaziale avviene essenzialmente all’interno di un fotogramma, mentre quella temporale sfrutta le componenti comuni tra fotogrammi successivi per effettuare
compressioni su un’intera scena. In questo senso, Motion JPEG effettua solo una compressione spaziale, mentre MPEG è sia spaziale che temporale. Altri formati importanti sono: Quicktime, proposto da Apple che è efficiente, ma qualitativamente modesto; AVI, proposto da Microsoft, è invece uno standard aperto: può supportare vari formati ed utilizzare anche diversi codec. (supporta anche MPEG2); Real Video, della Real, è un formato qualitativamente modesto, ma molto efficiente se usato per applicazioni di streaming video. Altri formati che stanno prendendo piede in contesto streaming sono anche ASF e WMF (Windows Media Format).
8. Conclusioni Chiaramente queste dispense non possono essere considerate esaurienti sull’argomento della codifica delle informazioni. L’intento degli autori è esclusivamente legato alla divulgazione delle idee e dei problemi fondamentali di questa disciplina. A questo scopo, consigliamo la visione del filmato “Dip – il pinguino digitale”, fruibile in streaming alla url: http://www.dipdigital.com Questo filmato cerca di esprimere in un linguaggio semplice ed accattivante le idee che stanno dietro la codifica di informazioni multimediali. Insomma, un video clip che spiega se stesso… buon “divertimento”!
9. Ringraziamenti Gli autori di queste dispense ringraziano per i consigli e i contributi sul materiale raccolto Francesco Borazzo, Marco Gribaudo, Vincenzo Lombardo, Matteo Sereno, Andrea Valle e tutti quelli che abbiamo dimenticato di citare.
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
24
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
10. Convertire il numero in base ottale 347 in base 10. Ris. …………..
Esercizi di riepilogo 1. Quanto vale un GigaByte? Ris. ………..
11. Convertire il numero in base esadecimale FF in base 10. Ris. …………..
2. Di quanti bit è costituito un MegaByte? Ris. ………..
12. Convertire il numero in base esadecimale 8B in base 10. Ris. …………..
3. Quanti byte sono 100 KB? Ris. ……….. 4. Abbiamo un file di 2000 byte ed un altro file di 2 KB. Chi è il più grande? Ris. ……….. 5. Dobbiamo scegliere un Hard Disk in base a quante informazioni può contenere. Il negoziante ce ne propone tre, dalle seguenti capacità: a. 5.000.000 KB; b. 600 MB; c. 20 GB; Quale dei tre compriamo, a parità di prezzo? Ris. ……….. 6. Abbiamo un file di testo costituito da 3072 caratteri (spazi e tabulazione inclusa). Quanti KB occupa? Ris. ………….. 7. Se un file di testo occupa 4 KB ed è in formato UNICODE, di quanti caratteri è costituito (spazi inclusi)? Ris. ………….. 8. Convertire il numero binario 10010010 in base 10. Ris. ………….. 9. Convertire il 100010 in Ris. …………..
numero base
binario 10.
13. Convertire il numero 136 in base 2. Ris. ………….. 14. Convertire il numero 136 in base 8. Ris. ………….. 15. Convertire il numero 136 in base 16. Ris. ………….. 16. Effettuare la seguente somma tra numeri in base binaria: 1001001 + 10011 Ris. ………….. 17. Quando si verifica un errore di Overflow? Ris. ………….. 18. Abbiamo un’immagine in bianco e nero e con risoluzione 100x250. Quanti byte occupa questa immagine? Ris. ………….. 19. Abbiamo un’immagine con 16 colori e risoluzione 150x200. Escludendo lo spazio occupato dalla palette associata alla bitmap, quanti KB occupano i dati relativi all’immagine? Ris. ………….. 20. Se memorizzassimo l’immagine dell’esercizio precedente usando direttamente la codifica RGB, quanto spazio occuperebbe? Ris. …………..
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
25
Dispense per il corso di “Informatica” – Facoltà di Giurisprudenza, Università degli Studi di Torino). A.A. 2004-2005, docente: Dr. Giancarlo Ruffo
21. Consideriamo un’immagine bitmap a 242 colori e risoluzione 150x80 a. Qual è la profondità dell’immagine? Ris. ………….. b. Quanto spazio occuperà la palette associata a questa immagine? Ris. ………….. c. Quanto spazio occuperanno i soli dati dell’immagine? Ris. ………….. d. Quanto spazio occuperà il file che contiene tutti i dati utili alla ricostruzione dell’immagine? Ris. ………….. 22. Abbiamo un’immagine bitmap con codifica RGB che occupa 36.000 byte. a. Qual è la sua risoluzione? Ris. ………….. b. Supponiamo di comprimere l’immagine usando un codec GIF con palette a 256 colori. Tale compressione riduce l’immagine di un altro 10%. Qual è la dimensione finale? Ris. …………..
23. Abbiamo un video digitale con queste caratteristiche: 12 fps, risoluzione 210x90, 5 minuti, 16 milioni di colori. Supponendo di usare una codifica non differenziale, quale sarà la dimensione finale del clip (si consideri un clip senza traccia audio). Ris. ………….. 24. Cos’è un reference frame? Ris. ………….. 25. Quanti KB occupano 3 minuti di dialogo dalla qualità accettabile secondo le considerazioni fatte per la voce umana? Ris. ………….. 26. Quanti KB occupa una canzone di 5 minuti in qualità CD? Ris. …………..
Dispense a cura del Prof. Rossano Gaeta e Dr. Giancarlo Ruffo
26