Autore Topic: Disegnare un'immagine impostando da codice il colore di ogni suo pixel  (Letto 231 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.723
  • Ne mors quidem nos iunget
    • Mostra profilo
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 00
laddove 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.
Codice: [Seleziona]
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


« Ultima modifica: 04 Gennaio 2017, 02:31:52 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Disegnare un'immagine impostando da codice il colore di ogni suo pixel
« Risposta #1 il: 01 Gennaio 2017, 10:03:53 »
 8) 8) 8)
 :ok: :ok: :ok:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro