Le foto che chiamiamo in bianco e nero, in realtà sono composte da diverse gradazione di grigio: cioè tutte le sfumature che vanno dal bianco fino al nero. In gergo informatico di dice in scala di grigi. In effetti i computer potrebbero creare un'immagine che usi solo il bianco e nero, ma perderemmo molti dettagli.
Ecco un esempio che mostra la stessa immagine con i tre diverse impostazioni:
Oggi vedremo come ottenere un'immagine in scala di grigi.
Prima di proseguire è meglio rinfrescare la teoria delle immagini in informatica. Ogni immagine è composta da puntini colorati, chiamati pixel. Ogni pixel è di un colore, ma questo colore si esprime attraverso quattro valori:
- quantità di trasparenza
- quantità di rosso
- quantità di verde
- quantità di blu
Per ottenere una sfumatura di grigio basta dare lo stesso valore ai tre colori fondamentali rosso, verde e blu. Il problema è: come calcolare questo valore?
Non esiste una regola scientifica per farlo, siccome è una trasformazione artificiale che noi imponiamo, sta a noi decidere il risultato che vogliamo ottenere.
Le tre modalità più utilizzate sono:
- lucentezza
- media
- luminosità
Il metodo della media fa la somma dei valori dei colori fondamentali e li divide per 3.
Il metodo della luminosità usa una formula particolare: 0.3 * rosso + 0.59 * verde + 0.11 blu.
Oggi vedremo tutti e tre i casi.
Creiamo uno stack con due immagini uguali, che chiameremo rispettivamente partenza e arrivo. Poi mettiamo un menu a tendina con le tre possibili trasformazioni (che chiameremo tipo), un pulsante per eseguire la trasformazione e una scrollbar di tipo progress bar che ci mostrerà a che punto è l'elaborazione. In questo modo abbiamo fatto metà del programma senza scrivere una riga di codice, ottenendo un risultato simile a questo:
Livecode può fornire l'imageData cioè una serie di lettere, dove ognuna rappresenta una dei 4 valori di ciascun pixel. Con le funzioni charToNum() e numToChar() possiamo trasformare le lettere in valori e viceversa.
In rete si trovano molti esempi di codice per trasformare le immagini con Livecode, ma sono quasi tutti troppo lenti; il codice ottimizzato per la velocità sulle immagini è il seguente:
on mouseUp #memorizziamo i dati dell'immagine put the imageData of image "partenza" into tImage put the number of chars of tImage into totChars #contatore delle lettere put 0 into cont repeat for each char tChar in tImage add 1 to cont put cont mod 4 into cont2 #cerchiamo di capire che valore sia (trasp., rosso , verde , Blu) switch cont2 case 1 #trasparenza put tChar after tImage2 break case 2 #rosso put chartonum(tChar) into rosso break case 3 #verde put chartonum(tChar) into verde break case 0 #blu put chartonum(tChar) into blu #qui cambiamo formula a seconda del tipo di trasformazione che preferiamo switch (the label of button "tipo") case "lucentezza" put ( max(rosso, verde, blu) + min(rosso, verde, blu) ) / 2 into tGray break case "media" put (rosso + verde + blu) / 3 into tGray break case "luminosità" put (0.3 * rosso + 0.59 * verde + 0.11 * blu) into tGray break end switch put numToChar(tGray) after tImage2 put numToChar(tGray) after tImage2 put numToChar(tGray) after tImage2 break end switch #qui ogni 1000 pixel aggiorniamo la barra dell'elaborazione if (cont mod 4000) = 0 then set the thumbpos of scrollbar "elaborazione" to round(cont/totChars * 100 ) end if end repeat # impostiamo i dati per la nuoca immagine set the imageData of image "arrivo" to tImage2 end mouseUp
Così possiamo vedere i risultati:



Nessun commento:
Posta un commento