Differenze tra le versioni di "Individuare i colori dei pixel di una immagine"

Da Gambas-it.org - Wikipedia.
Riga 80: Riga 80:
 
   
 
   
 
   st.Close
 
   st.Close
+
 
<FONT Color=gray>' ''Salva l'immagine come modificata:''</font>
 
  im.Save("''/percorso/ove/salvare/il/nuovo/file/immagine''")
 
 
 
  <FONT Color=gray>' ''Mostra l'immagine come modificata:''</font>
 
  <FONT Color=gray>' ''Mostra l'immagine come modificata:''</font>
   PictureBox1.Picture = Picture["''/percorso/del/nuovo/file/immagine''"]
+
   PictureBox1.Picture = imm.Picture
 
   
 
   
 
  '''End'''
 
  '''End'''

Versione delle 08:41, 5 nov 2014

Per individuare i colori dei pixel di una immagine, sono possibili almeno tre modalità.

Si raccomanda la lettura - per le informazioni generali sulla gestione dei pixel in Gambas - della seguente pagina della documentazione ufficiale: Image Management In Gambas.


con la proprietà .Pixels della Classe Image

La proprietà .Pixels della Classe Image ritorna un vettore di tipo Integer[] contenente in ciascun elemento il valore del colore di un pixel dell'immagine.

Esempio:

Public Sub Form_Open()

 Dim im As Image
 Dim j As Short
 
  im = Image.Load("/percorso/del/file/immagine")
 
  For j = 0 To im.Pixels.Max
' Mostra il valore del colore in rappresentazione esadecimale:
    Print Hex(im.Pixels[j], 8)
  Next

End


con la proprietà .Data della Classe Image ed i Memory Stream

La proprietà .Data della Classe Image ritorna un Puntatore ai dati della variabile di tipo Image. Si potrà, quindi, per mezzo dei Memory Stream leggere all'interno dell'area puntata dal predetto Puntatore.
Sarà possibile altresì scrivervi modificando quindi il colore di uno o di più pixel dell'immagine.

Nell'esempio che segue abbiamo una semplice immagine formata da 2 x 2 pixel dei seguenti colori: blu, giallo, rosso e verde. Si prcederà a vedere i valori di quei quattro pixel, ed infine a cambiare il colore del pixel rosso nel colore blu:

Public Sub Form_Open()
 
 With PictureBox1
   .X = 50
   .Y = 50
   .W = 40
   .H = 40
   .Stretch = True
 End With
 
End


Public Sub Button1_Click()

 Dim im As Image
 Dim st As Stream
 Dim fo, b As Byte
 Dim j As Short
 Dim s As String
 
  im = Image.Load("/percorso/del/file/immagine")

  fo = Len(im.Format)
 
' Viene dereferenziato il "Puntatore", mostrando così tutti i valori dei colori dei pixel della variabile immagine:
  st = Memory im.Data For Read Write
 
  For j = 0 To (im.H * im.W * fo) - 1
    Read #st, b
    If j Mod 4 = 0 Then Print "------------------"
    Print j, b, Hex(b, 2)
  Next


  Print "------------------"

' Viene modificato il colore del pixel che occupa 4 byte a partire dal 9° byte:
  Seek #st, 8
' Viene impostato il colore blu (se il formato è diverso dal "BGR", allora il primo byte è relativo al valore "alfa" !):
  s = Right("FF0000FF", fo * 2)
  Write #st, Val("&" & s) As Integer

' Vengono nuovamente letti i valori dei colori dopo la modifica del terzo pixel:
  Seek #st, 0
  For j = 0 To (im.H * im.W * fo) - 1
    Read #st, b
    If j Mod 4 = 0 Then Print "------------------"
    Print j, b, Hex(b, 2)
  Next

  st.Close
 
' Mostra l'immagine come modificata:
  PictureBox1.Picture = imm.Picture

End


individuando il colore di ciascun pixel mediante le sue coordinate x ed y

La terza modalità prevede l'individuazione del colore di ciascun pixel dell'immagine identificandolo attraverso le sue coordinate x ed y con la sintassi:

Image[x, y]


Esempio:

Public Sub Form_Open()

 Dim x, y As Byte
 Dim im As Image
 
  im = Image.Load("/percorso/del/file/immagine")
  
  For x = 0 To im.W - 1
    For y = 0 To im.h - 1
      Print Hex$(im[x, y], 6)
    Next
  Next


' Volendo usare un solo ciclo, potremo anche fare così, impostando in un vettore le coordinate dei pixel dell'immagine:
 Dim vett As Byte[] = [0, 0, 1, 1, 0, 1, 0, 1]
 Dim j As Byte
 Dim im As Image

  im = Image.Load("/percorso/del/file/immagine")

  For j = 0 To im.W * im.H - 1
    Print Hex$(im[vett[j], vett[j + 4]], 6)
  Next

End

Per analogia con questa modalità segnaliamo anche la seguente pagina della WIKI.