Creare un'immagine senza avere un file immagine

Da Gambas-it.org - Wikipedia.

Il caso considerato in questa pagina è quello in cui viene realizzata direttamente un'immagine, da mostrare in una PictureBox, senza che sia prelevata da un file immagine preesistente.


Immagine monocolore

Per generare da codice una immagine monocolore, potremo utilizzare sia la Classe Image che la Classe Picture.


Uso della Classe Image

Public Sub Form_Open()

 Dim i As Image
 Dim pc As Picture


' Istanziamo l'oggetto "Image", attribuendogli la dimensione in pixel ed un colore":
  i = New Image(100, 100, Color.Red)

   
' Trasformiamo l'oggetto "Image" in una "Picture",
' al fine di poterla mostrare con la "PictureBox":
  pc = i.Picture
 

' Dimensioniamo la "PictureBox" come la "Image", che avrà ovviamente
' anche le medesime dimensioni della nuova "Picture"; e carichiamo la  "Picture" nella "PictureBox":
  With PictureBox1
    .W = i.W
    .H = i.H
    .Picture = pc
  End With

End


Uso della Classe Picture

Public Sub Form_Open()

 Dim pc As Picture


' Istanziamo l'oggetto "Picture", attribuendogli la dimensione in pixel ed un colore":
  With pc = New Picture(100, 100)
    .Fill(Color.Red)
  End With
 

' Dimensioniamo la "PictureBox" come la "Picture"; e carichiamo la  "Picture" nella "PictureBox":
  With PictureBox1
    .W = pc.W
    .H = pc.H
    .Picture = pc
  End With

End


Immagine multicolore

Per generare da codice una immagine formata da due o più colori, dovremo utilizzare le risorse della Classe Image.

La procedura di realizzazione dell'immagine, consisterà nel creare innanzitutto una variabile di tipo "Image", impostando soltanto le dimensioni in pixel. Successivamente, l'impostazione dei colori avverrà scrivendo i valori (con risoluzione 32bit: il primo byte è relativo al codice Alfa, i restanti tre al colore vero e proprio) del colore di ciascun pixel all'interno dell'area di memoria della variabile "Image" creata.
Come sappiamo, per poter gestire un'area di memoria, ed in questo caso per potervi scrivere all'interno, bisognerà ottenere l'indirizzo di tale area mediante un Puntatore. L'indirizzo dell'area di memoria si otterrà agevolmente attraverso la proprietà .Data della Classe Image, oppure dapprima ottenendo il Puntatore alla variabile di tipo Image e dopo dereferenziando il Puntatore di Puntatore presente al 16° byte dell'area di memoria della variabile di tipo Image. Infine, la scrittura dei dati avverrà mediante la risorsa dei Memory Stream.


Mostriamo un esempio, nel quale si genererà una varibile di tipo Image di dimensioni 8x8 pixel: i primi 16 byte imposteranno pixel di colore rosso; altri 16 byte imposteranno pixel di colore verde; altri 16 byte imposteranno pixel di colore giallo; ed i restanti 16 byte imposteranno pixel di colore blu. Tali valori dei pixel saranno contenuti un una variabile vettorial di tipo Intero, in quanto valori a 32bit (ossia 4 byte per piciascun pixel).
E', inoltre, previsto il caricamento dell'immagine, così ottenuta, in una PictureBox, nonché la realizzazione di un file immagine di tipo png.

Public Sub Form_Open()

 Dim im As Image
 Dim ii As Integer[] = [&FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000,
                        &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000, &FFFF0000,
                        &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00,
                        &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00, &FF00FF00,
                        &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00,
                        &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00, &FFFFFF00,
                        &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF,
                        &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF, &FF0000FF]
 Dim st As Stream
 
' Generiamo una variabile di tipo "Image" attribuendo solo le dimensioni in pixel:
  im = New Image(8, 8)
 
  st = Memory im.Data For Write

' Scriviamo i dati dei 64 pixel nell'area di memoria della variabile di tipo "Image":
  ii.Write(st, 0, ii.Count)
  st.Close
   
  PictureBox1.Picture = im.Picture
   
  im.Save("/tmp/immago.png")
  
End