Articolo pubblicato sul n. 152 di MCmicrocomputer (Edizioni Technimedia Srl - Roma) nel giugno 1995

MCmicrocomputer


Digital Imaging:
P... come Pixel

di Andrea de Prisco

Come certamente gia' sapete, per festeggiare i primi 150 numeri della nostra amata rivista (il "complinumero" e' stato lo scorso mese di Aprile), abbiamo deciso di realizzare un CD-ROM contenente una raccolta selezionata dei migliori articoli pubblicati da MC in questi 14 anni di informatica personale.Copertina del numero di MCmicrocomputer contenente l'articolo
Andando, dunque, a rimettere il naso negli articoli che scrivevo una decina di anni fa, mi sono accorto come a quei tempi fosse dominante nei miei "pezzi" piu' il lato didattico-teorico che quello pratico-esecutivo. Devo, tra l'altro, buona parte della mia "evoluzione giornalistica" proprio ad una frase di Marco Marinacci rivoltami agli inizi degli anni ottanta. Suonava piu' o meno cosi': "L'importante e' farsi capire dai lettori. Nei passaggi piu' difficili e' meglio spiegare le cose due volte di seguito, in due modi anche solo leggermente diversi, in modo da esser sempre piuttosto certi di non divulgare fischi per fiaschi".
In quei tempi, e avendo fatto tesoro delle raccomandazioni del capo, riuscivo a portare sulle pagine di MC temi assolutamente impensabili per una rivista mensile di informatica, come la teoria della computabilita' logica, la struttura dei sistemi di calcolo (dal livello microcodice dei processori fino allo sviluppo di un protocollo di rete fault tolerant denominato ADPnetwork in onore della mia... infinita modestia) o alcune estensioni dei linguaggi di programmazione disponibili negli "home computer" dell'epoca.
In questa serie di articoli dedicati all'imaging digitale, di teoria effettivamente ne abbiamo fatto ben poca. L'approccio, per quanto possibile, e' sempre stato quello del "problema-risoluzione" e siamo andati avanti in questo modo mostrandovi continuamente esempi pratici.
Mi e' cosi' venuta voglia, questo mese, di tirare (momentaneamente) il freno a mano, per tuffarci brevemente negli aspetti di base della grafica, per essere certi - questa e' la mia speranza - che chi mi segue in questo divertente viaggio abbia ben chiari alcuni concetti fondamentali. I prossimi articoli, infatti, non potranno piu' prescindere da queste nozioni di base, visto che toccheremo via via temi piu' avanzati (dalla correzione cromatica alla corretta stampa a colori, solo per anticiparvi qualcosa). Mi rendo conto, infatti, che sin dall'inizio ho dato molte cose per scontate, con buona pace per chi segue MC (o il mondo dell'informatica) ormai da molti anni, ma comunicando "male" con chi e' completamente a digiuno di aspetti tecnici o che si e' avvicinato solo da poco a questo entusiasmante mondo.
Quindici o venti anni fa, far funzionare un computer era sinonimo di "programmare", da ormai una decina d'anni la stragrande maggioranza degli utenti sono veri e propri "utenti" e non necessariamente "tecnici". Oggi un hard disk, tanto per fare un esempio, e' solo un posto dove registriamo le nostre cose (poco piu' di una videocassetta...), avendo quasi del tutto dimenticato che si tratta di una struttura complessa sia dal punto di vista fisico che logico basata su svariate testine, tracce, settori e (SOPRATTUTTO!) un file-system.
Questo mese parleremo principalmente di pixel (acronimo di Picture Element, ma questo credo che sia del tutto inutile ribadirlo), di risoluzione grafica e risoluzione cromatica. Non vedremo elaborazioni digitali vere e proprie (ad eccezione della sezione dedicata ai lettori) ma sara' comunque una lettura interessante.
O, almeno, spero!

Binari digitali

Secondo alcuni tra i piu' fantasiosi teorici (perche' dar loro torto?) sembrerebbe che noi "umani" utilizziamo per i nostri calcoli le cifre decimali (da 0 a 9) per il semplice fatto che abbiamo dieci dita. Probabilmente se ne avessimo avuto otto, i nostri numeri sarebbero stati formati dalle sole cifre da 0 a 7. Tutto questo senza minimamente intaccare la nostra naturale evoluzione, visto che anche otto sole cifre sono comunque sufficienti per rappresentare qualsiasi entita' numerica e fare con queste ogni possibile operazione. Molto probabilmente sarebbe stato piu' contento Pitagora, con la sua tavola di sole 64 caselle in luogo di 100, e naturalmente gli scolaretti costretti ad imparare a memoria solo otto tabelline (per di piu' di sole otto righe!) invece di dieci. Certo, con sole otto dita dovrebbe essere piu' difficile suonare gli strumenti musicali, ma non per questo Bach e Chopin ci avrebbero lasciato a bocca asciutta.
Anche con sole otto cifre, infatti, utilizzando i medesimi meccanismi della comune aritmetica decimale (che in questo caso prende il nome di "ottale" o "base 8"), avremmo potuto ugualmente rappresentare tutti i numeri naturali, i numeri reali, i frazionari e cosi' via. Al posto di unita', decine, centinaia e migliaia, avremmo unita', "ottine", "sessantaquattrine", "cinquecentododicine"... ma il succo non cambia.
A questo punto, la domanda nasce spontanea: con sole otto cifre, come possiamo scrivere la quantita' superiori a 7? Semplice la risposta: allo stesso modo in cui nell'aritmetica in base 10 (decimale) riusciamo a scrivere quantita' superiori a 9: utilizziamo piu' cifre!
Ad esempio, la quantita' decimale 14 (pari a una decina e quattro unita') in base 8 viene rappresentata da una "ottina" e sei unita' (si scrive 16, ma vale sempre quattordici!). Cambiano i termini della scomposizione, ma non il procedimento. E questo vale per qualsiasi numero, quanto grande vogliamo, utilizzando sempre e soltanto le cifre da 0 a 7. Naturalmente esiste anche un procedimento per passare da ottale a decimale ed e' facile dimostrare che tale trasformazione e' sempre possibile per qualsiasi entita' numerica.
Discorso analogo per le operazioni aritmetiche: la somma, la sottrazione, la moltiplicazione e la divisione restano tali e quali, ricordando di utilizzare sempre le giuste tabelline per non diventare scemi.
Tutto questo vale per qualsiasi "base", anche maggiore di 10 (come l'aritmetica esadecimale in base 16) o la minima possibile che si chiama "binaria" (base 2).
Quest'ultima, per motivi strettamente legati alla semplificazione elettronica, e' quella utilizzata dai computer o, piu' in generale, da tutti i dispositivi digitali. Ragionare in base 2 vuol dire utilizzare due sole cifre, 0 e 1, due sole tabelline cortissime (urrah!) e una tavola pitagorica a dir poco comica: 4 caselle!
Anche in base due e' in ogni caso possibile rappresentare qualsiasi numero: certo, utilizzeremo numeri lunghissimi anche per quantita' numeriche tutto sommato modeste, ma come abbiamo gia' detto nulla cambia dal punto di vista della calcolabilita' di un'aritmetica di questo tipo.
Una cifra binaria, 0 o 1, e' notoriamente un bit (contrazione di binary digit) e generalmente otto bit formano un byte. Tutte le possibili combinazioni di 0 e di 1 che possono stare in un byte sono 256 (non e' una quantita' "a caso", e' pari a 2, la base, elevato ad 8, il numero di cifre in questione), quindi con un solo byte (di otto bit) e' possibile rappresentare i primi 256 numeri naturali (da 0 a 255).
Cio' premesso, lasciamo da parte byte e "sessantaquattrine" e concentriamo la nostra attenzione sull'immagine digitale.

Picture element

Premesso che un'immagine digitale e' formata da una quantita' piu' o meno grande di pixel (maggiore e' il loro numero piu' l'immagine digitale e' ricca di informazione e quindi di dettagli), la prima considerazione da fare riguarda il fatto che se le dimensioni di questi elementi sono piu' piccole della naturale grana fotografica, nessuna perdita di definizione e' imputabile al passaggio da immagine tradizionale alla sua rappresentazione digitale all'interno di un computer. Dato che un'immagine digitale e' formata da bit (e quindi da byte) piu' saranno i pixel di cui e' formata maggiore spazio occupera' in memoria.
Un fotogramma in formato 35mm (24x36) e' formato da svariati milioni di minuscoli granuli, per una sua codifica senza perdita di dettaglio alcuna sono necessari molti megabyte. Cio' dipende, oltre che dal numero di pixel utilizzati (di quest'aspetto parleremo alla fine), anche dal numero di colori codificabili: in pratica ogni singolo pixel in quanti colori diversi puo' essere rappresentato.
Rimanendo in termini generali, ad ogni pixel di un'immagine digitale e' associato un certo numero di bit. Piu' bit sono associati ad ogni pixel piu' colori riusciamo a rappresentare. Se la nostra immagine digitale e' composta da soli pixel bianchi e neri (come in una stampa tipografica ad un solo colore) e' sufficiente un bit per ogni pixel. Se, sempre ad esempio, decidiamo di associare il valore 0 ad ogni pixel bianco ed il valore 1 ad ogni pixel nero, abbiamo gia' effettuato la nostra prima, semplice, codifica. In figura 1a e' rappresentata (mi raccomando non ridete!) la codifica di un'immagine digitale strettamente bianco/nero di un albero di Natale. Dato che i colori sono solo due (bianco e nero) e' sufficiente, come detto, un bit per ogni pixel. In figura 1b, per maggiore chiarezza e' mostrata la stessa immagine sostituendo un trattino ad ogni 0 e un asterisco ad ogni 1.
Un'immagine di questo tipo, come e' facile verificare, e' formata da 1125 pixel (25x45) e dato che ogni pixel e' codificato con un solo bit, lo spazio necessario per la sua rappresentazione in memoria e' pari a 1125 bit.
Associando un numero maggiore di bit ad ogni pixel, possiamo digitalizzare della nostra immagine anche le sfumature di grigio o un pari numero di colori. Proseguendo nel nostro esempio, se avessimo associato due bit per ogni pixel avremo avuto come conseguenza la possibilita' di codificare (e quindi utilizzare) quattro colori o livelli di grigio. Due bit, infatti, permettono di ottenere quattro distinte combinazioni di 0 e di 1, che possiamo associare ai seguenti colori:

00 ---> Bianco
01 ---> Grigio chiaro
10 ---> Grigio scuro
11 ---> Nero

Naturalmente possiamo utilizzare le stesse combinazioni per ottenere altri colori, secondo le nostre necessita. Ad esempio:

00 ---> Bianco
01 ---> Verde
10 ---> Rosso
11 ---> Blu

Dovrebbe esser chiaro a questo punto che piu' bit associamo ad ogni pixel, piu' colori possiamo codificare e quindi trattare, memorizzare e visualizzare. Come rovescio della medaglia, e' altrettanto vero che un maggior numero di colori implicano sia una maggiore occupazione in memoria dell'immagine digitale sia una gestione piu' pesante e laboriosa quando e' necessario eseguire un trattamento digitale sulla nostra immagine. Con 256 colori (8 bit per pixel) il risultato "comincia" ad essere gradevole, specialmente se associamo a questi il meccanismo della "palette". Per non scendere a compromessi cromatici, utilizzando una codifica RGB (basata sui tre colori primari della sintesi additiva), e' necessario utilizzare almeno 24 bit (tre byte) per pixel, con i quali possiamo rappresentare piu' di 16.7 milioni di colori: per la precisione, 256 livelli di rosso, 256 livelli di verde, 256 livelli di blu per ogni punto. Se prendete una calcolatrice e moltiplicate 256x256x256 ottenete come risultato 16.777.216 che e' il numero totale di combinazioni possibili con una codifica di questo tipo.
Grazie al fatto che l'occhio umano difficilmente riesce a notare differenze tra un'immagine a 16.7 milioni di colori e un'immagine reale (notoriamente composta da infiniti colori), tale codifica e' soprannominata "true color". Ovviamente si tratta di vero e proprio "falso tecnologico" che sfrutta le nostre limitate (per modo di dire...) capacita' percettive. Infatti, per quanto possano sembrare tanti 16.7 milioni di colori, non sono "in pratica" tantissimi una volta constatato che sono la combinazione di 256 livelli di ogni colore primario. E' il numero 256 che, in alcuni casi, e' spaventosamente piccolo quando cerchiamo di correggere o modificare una ben precisa componente cromatica di un'immagine. Ma di quest'aspetto, lo prometto, ne parleremo in uno dei prossimi articoli di Digital Imaging.

Colori e Palette

Facciamo un passo indietro e, lasciando momentaneamente da parte la codifica "true color", diamo un rapido sguardo ad alcune tecniche particolari con le quali e' possibile ottenere, a parita' di spazio occupato in memoria, risultati visivamente piu' accettabili sotto il profilo cromatico.
La prima e piu' diffusa tecnica consiste nell'utilizzo di una "palette" che pemette di ottimizzare l'uso dei colori disponibili il cui numero, come detto, dipende esclusivamente dal numero di bit associati ad ogni pixel. Se il nostro sistema digitale lavora ad esempio con soli 256 colori e questi sono stabiliti in maniera fissa e immodificabile dal costruttore una volta per tutte, potremmo avere un po' di problemi per tutte quelle immagini in cui i colori non corrispondono "piu' di tanto" ai 256 prefissati. Vedremo le nostre immagini, specialmente se ricche di sfumature, con i colori falsati per il fatto che il sistema ha dovuto utilizzare solo quelli disponibili o, molto spesso, solo un ristretto sottoinsieme di questi. Si puo' rimediare parzialmente a questo problema attraverso il cosiddetto "dithering" che permette, accostando punti di colore diverso, di ottenere nuove tinte con comprese nell'elenco originario. Ma in questo caso abbiamo una perdita di risoluzione e pur guadagnandoci dal punto di vista cromatico ci rimettiamo in definizione.
Tornando, quindi, al caso dei 256 colori "fissi e immodificabili", in pratica vuol dire che disporremo di una decina di grigi, una decina di blu, una decina di rossi, una decina di verdi, una decina di gialli, una decina di marroni e cosi' via (fino a 256 colori totali). Se nella nostra immagine digitale sono presenti solo sfumature di blu e sfumature di verde (ad esempio la foto di un prato con un bel cielo sullo sfondo impreziosito da qualche nuvola) sebbene il sistema metta a disposizione 256 colori noi riusciremo ad utilizzarne soltanto una ventina, i dieci verdi e i dieci blu.
Per ovviare a questo inconveniente, e' sufficiente utilizzare, in luogo dei 256 colori "fissi e immodificabili" un elenco di colori ridefinibili dall'utente: una palette. In questo modo i 256 colori disponibili non sono fissati dal costruttore, ma possono essere impostati dall'utente (o automaticamente dal sistema). Ferma restando quindi l'occupazione di memoria per quel che riguarda l'immagine (8 bit per pixel), ognuna delle possibili 256 combinazioni non corrisponde piu' ad un colore preimpostato, ma ad una determinata casella della "Palette": se ogni casella di quest'ultima e' formata da 24 bit, avremo si' 256 colori, ma a scelta tra gli oltre 16.7 milioni codificabili con una tale quantita' di informazione. Ritornando all'esempio di prima, possiamo definire oltre un centinaio di sfumature diverse di verde ed altrettante sfumature diverse di rosso (oltre ad una cinquantina di bianchi, grigi e grigetti per le nuvole) per ottenere un'immagine ben piu' realistica.
Un secondo sistema per diminuire l'occupazione di memoria e' denominato HAM (hold and modify) ed e' molto utilizzato in ambiente Amiga. Il modo HAM piu' recente (il nome esatto e' HAM8) utilizza come nel caso precedente 8 bit per ogni pixel, ma vengono interpretati nel seguente modo: se i primi due bit sono posti a 00, i rimanenti sei indicano uno dei sessantaquattro colori definiti in un'apposita palette di tale dimensione. Questi sessantaquattro colori (due elevato a sei equivale per l'appunto a tale quantita') rappresentano i colori di base e sono anch'essi liberamente definibili dall'utente. Viceversa, se i primi due bit sono posti a 01, i rimanenti sei bit indicano la quantita' di blu mentre le componenti rosso e verde restano invariate rispetto al pixel precedente. Se i primi due bit sono posti a 10, e' il rosso a giocare la sua carta (i rimanenti sei bit indicano il valore per questa quantita' cromatica) mentre blu e verde sono gli stessi, come prima, del pixel adiacente. Infine se troviamo 11 i rimanenti sei pixel specificano il verde e come al solito le rimanenti quantita' cromatiche sono quelle del pixel precedente. Grazie a questa tecnica HAM8 e' possibile codificare oltre 256.000 colori con soli 8 bit/pixel nonostante il fatto che con il metodo tradizionale ne avremmo dovuti utilizzare ben diciotto (piu' del doppio).
Il rovescio della medaglia (nulla e' concesso gratuitamente!) sta nel fatto che per passare da un qualsiasi colore ad un altro, sempre tra gli oltre 256.000 possibili, e' facile "sprecare" fino a due pixel di colore intermedio (per questo motivo e' necessario calcolare nel migliore dei modi i 64 colori di base). Se nella nostra immagine ci sono bruschi cambiamenti di colore, e non e' piu' possibile "pescare" nella palette, tali cambiamenti saranno visualizzati solo come una (spesso antiestetica) transizione cromatica tra le due tinte larga al massimo due pixel. Quando invece si tratta di mostrare immagini per loro natura molto sfumate, tipo incarnati, meglio se primi piani, l'effetto e' molto attraente sino al punto di non notare alcunche' di strano nell'immagine che stiamo guardando.

Risoluzioni e Antialiasing

Se da una parte abbiamo appena visto che piu' colori utilizziamo piu' spazio occupera' la nostra immagine in memoria, non dobbiamo dimenticare che il dato principale riguardo la dimensione finale dipende dal numero totale di pixel utilizzati. Banalmente, come abbiamo gia' detto, piu' la nostra immagine sara' ricca di dettagli, piu' spazio occupera' in memoria.
Anche nel campo della risoluzione esiste un trucchetto per risparmiare spazio. E non mi sto riferendo all'eventuale compressione di un'immagine una volta salvata (come avviene ad esempio, con modalita' ed effetti ben diversi, con i file PICT, GIF, JPEG, ecc.) ma all'occupazione reale dell'immagine una volta caricata in memoria.
Tale tecnica e' detta "antialiasing" e permette di avere una maggiore risoluzione apparente. Si basa sull'utilizzo di sfumature intermedie per simulare dettagli inesistenti. Se e' vero che un'immagine vale piu' di mille parole, date uno sguardo ai due cerchi mostrati in questa pagina. Il secondo sembra tracciato utilizzando una risoluzione maggiore: il cerchio e' piu' tondo, tant'e' che si vede molto meno la scalettatura dovuta ai pixel. In realta' la risoluzione utilizzata e' la stessa per entrambe le immagini ed e' pure piuttosto bassa. Il secondo cerchio e' tracciato utilizzando il meccanismo dell'antialiasing: nei due particolari ingranditi possiamo ben notare la differenza. Alcuni punti di tonalita' intermedia sono posizionati in modo tale da ammorbidire gli scalini dei pixel. L'effetto finale, pura illusione ottica, parla da se': sim... sala...bim!

000000000000000000000000000000000000000000000
000000000000000000000010000000000000000000000
000000000000000000000101000000000000000000000
000000000000000000001000100000000000000000000
000000000000000000010000010000000000000000000
000000000000000000100000001000000000000000000
000000000000000001111000111100000000000000000
000000000000000000010000010000000000000000000
000000000000000000100000001000000000000000000
000000000000000001000000000100000000000000000
000000000000000010000000000010000000000000000
000000000000000111100000001111000000000000000
000000000000000001000000000100000000000000000
000000000000000010000000000010000000000000000
000000000000000100000000000001000000000000000
000000000000001000000000000000100000000000000
000000000000011110000000000011110000000000000
000000000000000100000000000001000000000000000
000000000000001000000000000000100000000000000
000000000000010000000000000000010000000000000
000000000000100000000000000000001000000000000
000000000001111111111000111111111100000000000
000000000000000000001000100000000000000000000
000000000000000000001111100000000000000000000
000000000000000000000000000000000000000000000
 

FIGURA 1 A: un'immagine digitale a bassissima risoluzione in bianco e nero rappresentante un alberello di Natale


---------------------------------------------
----------------------*----------------------
---------------------*-*---------------------
--------------------*---*--------------------
-------------------*-----*-------------------
------------------*-------*------------------
-----------------****---****-----------------
-------------------*-----*-------------------
------------------*-------*------------------
-----------------*---------*-----------------
----------------*-----------*----------------
---------------****-------****---------------
-----------------*---------*-----------------
----------------*-----------*----------------
---------------*-------------*---------------
--------------*---------------*--------------
-------------****-----------****-------------
---------------*-------------*---------------
--------------*---------------*--------------
-------------*-----------------*-------------
------------*-------------------*------------
-----------**********---**********-----------
--------------------*---*--------------------
--------------------*****--------------------
---------------------------------------------

 

Figura 1 B : Lo stesso alberello di figura 1A sostituendo ad ogni 0 un trattino e ad ogni 1 un asterisco

 

(Riquadro)

S.O.S. Digital Imaging

L'immagine scelta questo mese per il fotoritocco digitale ci e' stata inviata dal lettore Lillo Mancuso di Torino. Si tratta di uno scorcio interno del Palazzo Ducale di Venezia, grandioso edificio civile della Serenissima, tra i piu' ammirati e celebri palazzi del mondo per la concezione architettonica e i tesori d'arte in esso racchiusi, nonche' prestigiosa sede del Doge e delle piu' alte magistrature della Repubblica veneta.
"Ammirato quanto deturpato", come afferma lo stesso autore, "da quelle orribili transenne, che oltre ad impedirne l'accesso ai piani superiori (l'immagine risale a sette anni fa), non ne consentivano nemmeno una dignitosa ripresa fotografica."
Eliminare particolari indesiderati, come piu' volte abbiamo avuto modo di mostrare in queste pagine, non e' certo un problema, specialmente quando e' possibile attingere ad altre porzioni dell'immagine per ricostruire i dettagli mancanti. Agendo per via digitale, con il consueto strumento "Timbro", le transenne sono scomparse facilmente e in pochi minuti.
L'immagine originale (qualita' della stampa ricevuta a parte: mi chiedo perche' certi laboratori continuano ad esistere...) e' comunque piuttosto bella. Peccato che un ulteriore elemento di disturbo (non segnalato dall'autore) sia rappresentato dalle linee cadenti, dovute alla ripresa dal basso verso l'alto. Nella fotografia tradizionale, per correggere questo tipo di inconveniente, e' necessario disporre di una macchina fotografica a banco ottico o, quanto meno, di un obiettivo decentrabile montato su un apparecchio reflex. Inutile aggiungere che e' strettamente necessario un robusto treppiedi, un po' di pazienza (non sono certo foto da gita scolastica) e, naturalmente, uno schermo di messa a fuoco quadrettato, fatto a posta per la fotografia architettonica.
A noi, ovviamente, non ce ne frega niente ne' del basculaggio ne' del treppiedi (al diavolo pure il fotolaboratorio da strapazzo!) e raddrizziamo digitalmente le linee cadenti non senza un preventivo riequilibrio dei livelli ed una sistematina alla curva di gamma (in pratica gli ho fatto il tagliando dei 120.000 chilometri).
Per annullare la distorsione prospettrica e' stato utilizzato come sempre Photoshop (Sua Eccellenza!) e in particolare la funzione "Distorsione" presente nel sottomenu' Effetti del menu' Immagine. La prima operazione da compiere sara' quella di valutare il livello di intervento relativo alla correzione. Per fare questo si tracciano (al limite sulla fotografia cartacea, io ho utilizzato sull'immagine digitale un livello aggiuntivo gentilmente offerto da Photoshop 3.0) da ognuno degli angoli inferiori due linee nella direzione del punto di fuga della nostra prospettiva da correggere, misurando a che distanza dai rimanenti due angoli intersecano il bordo superiore dell'immagine. A questo punto si selezione l'intera immagine e, dopo aver richiamato la funzione "Distorsione", si trascinano uno alla volta gli angoli inferiori per una distanza pari a quella misurata precedentemente sul bordo superiore. Effettuato il posizionamento dei due angoli, possiamo dare l'ok (semplicemente cliccando all'interno dell'area) e in pochi secondi otteniamo la trasformazione voluta. L'immagine appena distorta (nel nostro caso corretta) e' mostrata nella fotografia piccola: le linee verticali ora sono tutte parallele, il punto di fuga e' stato rispedito a distanza infinita, e basterebbe selezionare una porzione rettangolare interna al trapezio per ottenere il nuovo taglio. Sempre per la serie "Non mi basta mai" (cfr MC. 151 pag. ___) ho preferito selezionare una porzione piu' ampia, ricostruendo, ovvero inventando, i pezzi mancanti. Che ve ne pare?


Articolo pubblicato su www.digiTANTO.it - per ulteriori informazioni clicca qui