Gambas consente non solo di caricare un'immagine da un file, per mostrarla in una
PictureBox, ma consente anche di crearla e di disegnarla
pixel per pixel direttamente via codice.
La definizione del colore di ciascun pixel dell'immagine è attualmente possibile solo accedendo all'area riservata dell'oggetto
Image, destinata a contenere i dati afferenti appunto ai pixel dell'immagine e il cui indirizzo di memoria è ritornato dalla proprietà "
.Data" dell'oggetto
Image.
Dunque questa proprietà ci consente di manipolare via codice, come in una sorta di ingegneria genetica, ogni singolo valore costituente i pixel dell'immagine contenuta dall'oggetto
Image.
Ogni pixel è per lo più costituito da 4 byte, avendo così una risoluzione a 32-bit (8 bit x 4 byte = 32 bit): il 1° byte rappresenta il canale "
Alfa" dell'immagine, con il quale è possibile regolare la trasparenza del colore del pixel. I restanti tre byte rappresentano i valori RGB del colore.
Pertanto, ad esempio i valori di un pixel di colore rosso saranno così impostati in rappresentazione esadecimale:
&FF
FF 00 00laddove il primo valore (&FF) rappresenta, come già detto, il canale
Alfa, ed in questo esempio è impostato alla massima opacità (quindi trasparenza completamente
nulla).
Per poter avere allocata l'area di memoria appositamente destinata a contenenre i dati costituenti tutti i pixel dell'immagine, è necessario innanzitutto creare ovviamente un Oggetto di tipo
Image, impostandone anche le proprietà utili per definire la dimensione
in pixel dell'immagine.
Dopo ciò, si può passare a scrivere nell'area di memoria, destinata a contenere i dati dei pixel, i 4 valori per ciascun pixel dell'immagine.
Va da sé che la dimensione finale dell'immagine sarà data dalla seguente moltiplicazione: pixel_larghezza x pixel_altezza x (32_bit / 8).
Poiché, come sappiamo, per scrivere nell'area di memoria puntata da un
Puntatore, in Gambas è possibile esclusivamente mediante l'uso dei
Memory Stream, dovremo usare tale risorsa di Gambas per impostare i valori dei colori di ciascun pixel del'immagine.
Mostriamo un esempio pratico, nel quale si creerà da codice (...quasi manualmente) una semplice immagine di dimensione 256x256 pixel, costituita da 4 righe verticali colorate con i colori: rosso, verde, giallo e blu che si ripetono in tale ordine per otto volte. L'immagine, così costruita, viene infine mostrata in una
PictureBox.
Public Sub Form_Open()
Dim im As Image
Dim c, i As Integer
Dim b, j As Byte
Dim st As Stream
' Imposta la dimensione della immagine, definendo un quadrato in pixel i*i :'
i = 256
' Stabilisce quante volte ciascuna riga di un colore sarà presente nell'immagine:
j = 8
' Imposta la dimensione dell'oggetto "Image" coerentemente con quella dell'immagine:'
im = New Image(i, i)
' Mediante i "Memory Stream" apre in scrittura l'area di memoria, attraverso il suo indirizzo ritornato
' dalla proprietà ".Data" dell'oggetto "Image", ove vengono memorizzati i dati dei pixel dell'oggetto "Image":
st = Memory im.Data For Write
' Scrive i dati dei colori di ciascun pixel (risoluzione a 32-bit) nell'apposita area di memoria:
For c = 1 To (i * i) / (j * 4)
For b = 1 To j
Write #st, &FFFF0000 As Integer ' pixel Rosso '
Next
For b = 1 To j
Write #st, &FF00FF00 As Integer ' pixel Giallo '
Next
For b = 1 To j
Write #st, &FFFFFF00 As Integer ' pixel Verde '
Next
For b = 1 To j
Write #st, &FF0000FF As Integer ' pixel Blu '
Next
Next
st.Close
' Imposta la "PictureBox" e vi carica l'immagine, affinché questa sia mostrata:'
With PictureBox1
.X = 10
.Y = 10
.W = im.W
.H = im.H
.Picture = im.Picture
End With
End