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

Da Gambas-it.org - Wikipedia.
 
(19 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per individuare i colori dei pixel di una immagine, sono possibili almeno tre modalità.
+
==Individuare i colori dei pixel di una immagine mediante le risorse native di Gambas==
 +
Per individuare i colori dei pixel di una immagine mediante le sole risorse native di Gambas, sono possibili almeno quattro modalità.
  
Si raccomanda la lettura - per le informazioni generali sulla gestione dei pixel in Gambas - della seguente pagina della documentazione ufficiale: [http://gambaswiki.org/wiki/doc/imageconv Image Management In Gambas].
+
Si raccomanda la lettura - per le informazioni generali sulla gestione dei pixel in Gambas - della seguente pagina della documentazione ufficiale:
 +
[http://gambaswiki.org/wiki/doc/imageconv Image Management In Gambas].
  
 
+
===Uso della Proprietà ".Pixels" della Classe ''Image''===
===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 (dunque a 32 bit) del colore di un pixel dell'immagine.
La proprietà ''.Pixels'' della Classe ''Image'' ritorna un vettore di tipo ''Integer[]'' contenente in ciascun elemento il valore (dunque a 32 bit) del colore di un pixel dell'immagine.
 
  
 
Esempio:
 
Esempio:
Riga 13: Riga 14:
 
   Dim i As Integer
 
   Dim i As Integer
 
    
 
    
  im = Image.Load("''/percorso/del/file/immagine''")
+
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
    
 
    
  For i = 0 To <FONT Color=#B22222>im.Pixels.Max</font>
+
  For Each i In im.Pixels
<FONT Color=gray>' ''Mostra il valore del colore in rappresentazione esadecimale:''</font>
+
    Print Hex(i, 8)
    Print Hex(<FONT Color=#B22222>im.Pixels[i]</font>, 8)
+
  Next
  Next
 
 
   
 
   
 
  '''End'''
 
  '''End'''
  
  
===con la proprietà ''.Data'' della Classe ''Image'' ed i ''Memory Stream''===
+
===Uso della Proprietà ".Data" della Classe ''Image'' e le funzioni di dereferenziazione===
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''.
+
La proprietà ".Data" della Classe ''Image'' ritorna un ''Puntatore'' all'area di memoria dell'Oggetto "Image", contenente ii dati della variabile di tipo ''Image''. E' dunque coì possibile per mezzo delle funzioni di dereferenziazione, native di Gambas, leggere all'interno dell'area puntata dal predetto ''Puntatore''.
<BR>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. Saranno mostrati i valori in rappresentazione esadecimale dei quattro pixel.
 +
'''Public''' Sub Button1_Click()
 +
 
 +
  Dim im As Image
 +
  Dim i, fo As Integer
 +
   
 +
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 +
 
 +
  fo = im.Depth / 8
 +
 
 +
  For i = 0 To (im.W * im.H * fo) - 1 Step fo
 +
    Print Hex(<FONT Color=#B22222>Int@</font>(im.Data + i), 8)
 +
  Next
 +
 
 +
'''End'''
 +
 
 +
 
 +
===Uso della Proprietà ".Data" della Classe ''Image'' ed i ''Memory Stream''===
 +
Questo esempio è simile al precedente, ma si userà la risorsa dei ''Memory Stream'' per 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 procederà con il vedere quei quattro pixel e cambiando, poi, il colore del pixel rosso nel colore blu:
+
Nell'esempio che segue supponiamo di avere una semplice immagine formata da 2 x 2 pixel dei seguenti colori: blu, giallo, rosso e verde.
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
    
 
    
Riga 47: Riga 66:
 
   Dim fo, b As Byte
 
   Dim fo, b As Byte
 
   Dim j As Integer
 
   Dim j As Integer
  Dim s As String
 
 
    
 
    
  im = Image.Load("''/percorso/del/file/immagine''")
+
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
   
 
   
  fo = Len(im.Format)
+
  fo = im.Depth / 8
 
    
 
    
 
  <FONT Color=gray>' ''Viene dereferenziato il "Puntatore", mostrando così tutti i valori dei colori dei pixel della variabile immagine:''</font>
 
  <FONT Color=gray>' ''Viene dereferenziato il "Puntatore", mostrando così tutti i valori dei colori dei pixel della variabile immagine:''</font>
  st = Memory im.Data For Read Write
+
  st = Memory im.Data For Read
 +
 
 +
  For j = 0 To (im.H * im.W * fo) - 1  <FONT Color=gray>' ''La dimensione in byte effettiva di un'immagine si ottiene moltiplicando i pixel per la quantità di byte che compongono un singolo pixel (formato dei pixel)''</font>
 +
    Read #st, b
 +
    If j Mod 4 = 0 Then Print "------------------"
 +
    Print j;; b;; Hex(b, 2)
 +
  Next
 
    
 
    
  For j = 0 To (im.H * im.W * fo) - 1   <FONT Color=gray>' ''La dimensione in byte effettiva di un'immagine si ottiene moltiplicando i pixel per la quantità di byte che compongono un singolo pixel (formato dei pixel)''</font>
+
   st.Close
    Read #st, b
 
    If j Mod 4 = 0 Then Print "------------------"
 
    Print j;; b;; Hex(b, 2)
 
  Next
 
 
 
  Print "------------------"
 
 
<FONT Color=gray>' ''Viene modificato il colore del pixel che occupa 4 byte a partire dal 9° byte:''</font>
 
  Seek #st, 8
 
<FONT Color=gray>' ''Viene impostato il colore blu (se il formato è diverso dal "BGR", allora il primo byte è relativo al valore "alfa" !):''</font>
 
  s = Right("FF0000FF", fo * 2)
 
  Write #st, Val("&" & s) As Integer
 
 
<FONT Color=gray>' ''Vengono nuovamente letti i valori dei colori dopo la modifica del terzo pixel:''</font>
 
  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
 
 
    
 
    
 
  <FONT Color=gray>' ''Mostra l'immagine come modificata:''</font>
 
  <FONT Color=gray>' ''Mostra l'immagine come modificata:''</font>
  PictureBox1.Picture = im.Picture
+
  PictureBox1.Image = im
 
   
 
   
 
  '''End'''
 
  '''End'''
  
  
===puntando all'area di memoria della variabile ''Image''===
+
===Puntando all'area di memoria della variabile di tipo ''Image''===
Nel paragrafo precedente abbiamo visto come Gambas mediante la proprietà ''.Data'' della Classe ''Image'' consenta di puntare alla sub-area di memoria di una variabile di tipo ''Image'', e di leggere i valori corrispondenti ai colori dei pixel dell'immagine.
+
Nei precedenti due paragrafi abbiamo visto come Gambas mediante la proprietà ".Data" della Classe ''Image'' consenta di puntare alla sub-area di memoria di una variabile di tipo ''Image'', e di leggere i valori corrispondenti ai colori dei pixel dell'immagine.
  
 
L'accesso a tale sub-area di memoria dell'area principale di memoria di una variabile di tipo ''Image'' può essere effettuato anche direttamente mediante i ''Puntatori'' e la dereferenzianzione dei medesimi.
 
L'accesso a tale sub-area di memoria dell'area principale di memoria di una variabile di tipo ''Image'' può essere effettuato anche direttamente mediante i ''Puntatori'' e la dereferenzianzione dei medesimi.
<BR>Sappiamo, come già detto, che i valori dei colori dei pixel di una variabile di tipo ''Image'' sono contenuti in una specifica area di memoria riservata, il cui indirizzo è indicato al 16° byte dell'area di memoria principale della predetta variabile di tipo ''Image''.
+
<BR>Sappiamo, come già detto, che i valori dei colori dei pixel di una variabile di tipo ''Image'' sono contenuti in una specifica area di memoria riservata, il cui indirizzo è indicato al 17° byte (indice 16) dell'area di memoria principale della predetta variabile di tipo ''Image''.
  
Mostriamo un esempio pratico, nel quale è possibile vedere gli otto byte - iniziando da 16° - che rappresentano il valore dell'indirizzo dell'area di memoria contenente i valori dei pixel della variabile di tipo ''Image'' appositamente creata:  
+
Mostriamo un esempio pratico, nel quale si userà la funzione di dereferenziazione "Byte@()":
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
 
   
 
   
 
   Dim im As Image
 
   Dim im As Image
   Dim p As Pointer
+
   Dim p1, p2 As Pointer
   Dim st As Stream
+
   Dim i As Integer
  Dim j, b As Byte
 
 
    
 
    
  im = New Image(2,2, Color.Red)
+
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 +
 
 +
  p1 = Object.Address(im)
 +
  p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
 
    
 
    
  p = Object.Address(im)
+
  For i = 0 To (im.W * im.H * (im.Depth / 8)) - 1
+
    Print i, Hex(Byte@(p2 + i), 2)
  st = Memory p For Read
+
  Next
  For j = 0 To 23
 
    Read #st, b
 
    Print j;; Hex(b)
 
  Next
 
 
  st.Close
 
 
'''End'''
 
 
 
Individuato l'indirizzo dell'area di memoria riservata contenente i valori dei pixel della variabile di tipo ''Image'', dovrà essere dereferenziato come ''Puntatore'' ad un ''Intero''.
 
 
 
Mostriamo un esempio, nel quale sarà creata una semplice immagine di 2x2 pixel di colore rosso. Si provvederà mediante la procedura descritta a mostrare i dati grezzi dell'immagine, ossia i valori dei colori dei pixel.
 
'''Public''' Sub Form_Open()
 
 
  Dim im As Image
 
  Dim p1, p2 As Pointer
 
  Dim st As Stream
 
  Dim j As Byte
 
 
 
<FONT Color=gray>' ''Creiamo ed istanziamo la variabile di tipo "Image":''</font>
 
  im = New Image(2,2, Color.Red)
 
 
    
 
    
<FONT Color=gray>' ''Otteniamo innanzitutto un Puntatore all'area di memoria dell'immagine appena crata":''</font>
 
  p1 = Object.Address(im)
 
 
<FONT Color=gray>' ''Accediamo all'area di memoria contenente i valori dei colori dei pixel dell'immagine,
 
' ''dereferenziando il suo Puntatore presente a cominciare dal 16° byte dell'area di memoria principale:''</font>
 
  p2 = Pointer@(p1 + 16)
 
 
<FONT Color=gray>' ''Viene dereferenziato il Puntatore all'area di memoria contenente i valori dei colori dei pixel dell'immagine:''</font>
 
  For j = 0 To 3
 
    Print j;; Hex(Int@(p2))
 
<FONT Color=gray>' ''Si saltano 4 byte, poiché il colore di ogni pixel è individuato da 32bit:''</font>
 
    p2 = p2 + 4
 
  Next
 
 
 
 
  '''End'''
 
  '''End'''
 
 
  
  
===individuando il colore di ciascun pixel mediante le sue coordinate x ed y===
+
===Individuando il colore di ciascun pixel mediante le sue coordinate x ed y===
 
Questa modalità prevede l'individuazione del colore di ciascun pixel dell'immagine identificandolo attraverso le sue coordinate x ed y con la sintassi:
 
Questa 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]
 
  Image[x, y]
 
 
 
Esempio:
 
Esempio:
 
  '''Public''' Sub Form_Open()
 
  '''Public''' Sub Form_Open()
Riga 157: Riga 122:
 
   Dim im As Image
 
   Dim im As Image
 
    
 
    
  im = Image.Load("''/percorso/del/file/immagine''")
+
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
    
 
    
  For x = 0 To im.W - 1
+
  For x = 0 To im.W - 1
    For y = 0 To im.h - 1
+
    For y = 0 To im.h - 1
      Print Hex$(im[x, y], 6)
+
      Print Hex$(im[x, y], 6)
    Next
+
    Next
  Next
+
  Next
+
 
 
 
  <FONT Color=gray>' ''Volendo usare un solo ciclo, potremo anche fare così, impostando in un vettore le coordinate dei pixel dell'immagine:''
 
  <FONT Color=gray>' ''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 vett As Byte[] = [0, 0, 1, 1, 0, 1, 0, 1]
  Dim j As Byte
+
' Dim j As Byte
  Dim im As Image
+
' Dim im As Image
   
+
  '
  im = Image.Load("''/percorso/del/file/immagine''")
+
im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
   
+
  '
  For j = 0 To im.W * im.H - 1
+
For j = 0 To im.W * im.H - 1
    Print Hex$(im[vett[j], vett[j + 4]], 6)
+
'    Print Hex$(im[vett[j], vett[j + 4]], 6)
  Next</font>
+
Next</font>
 
   
 
   
 
  '''End'''
 
  '''End'''
Per analogia con questa modalità segnaliamo anche la [[Individuare_il_colore_di_un_determinato_pixel|seguente pagina della WIKI]].
+
 
 +
 
 +
 
 +
=Note=
 +
[1] Per analogia di argomento si segnala anche la pagina: [[Individuare_il_colore_di_un_determinato_pixel|Individuare il colore di un determinato pixel]].

Versione attuale delle 22:53, 8 nov 2021

Individuare i colori dei pixel di una immagine mediante le risorse native di Gambas

Per individuare i colori dei pixel di una immagine mediante le sole risorse native di Gambas, sono possibili almeno quattro 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.

Uso della Proprietà ".Pixels" della Classe Image

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

Esempio:

Public Sub Form_Open()

 Dim im As Image
 Dim i As Integer
 
 im = Image.Load("/percorso/del/file/immagine")
 
 For Each i In im.Pixels
   Print Hex(i, 8)
 Next

End


Uso della Proprietà ".Data" della Classe Image e le funzioni di dereferenziazione

La proprietà ".Data" della Classe Image ritorna un Puntatore all'area di memoria dell'Oggetto "Image", contenente ii dati della variabile di tipo Image. E' dunque coì possibile per mezzo delle funzioni di dereferenziazione, native di Gambas, leggere all'interno dell'area puntata dal predetto Puntatore.

Nell'esempio che segue abbiamo una semplice immagine formata da 2 x 2 pixel dei seguenti colori: blu, giallo, rosso e verde. Saranno mostrati i valori in rappresentazione esadecimale dei quattro pixel.

Public Sub Button1_Click()
 
 Dim im As Image
 Dim i, fo As Integer
    
 im = Image.Load("/percorso/del/file/immagine")
  
 fo = im.Depth / 8
  
 For i = 0 To (im.W * im.H * fo) - 1 Step fo
   Print Hex(Int@(im.Data + i), 8)
 Next
  
End


Uso della Proprietà ".Data" della Classe Image ed i Memory Stream

Questo esempio è simile al precedente, ma si userà la risorsa dei Memory Stream per 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 supponiamo di avere una semplice immagine formata da 2 x 2 pixel dei seguenti colori: blu, giallo, rosso e verde.

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 Integer
 
 im = Image.Load("/percorso/del/file/immagine")

 fo = im.Depth / 8
 
' Viene dereferenziato il "Puntatore", mostrando così tutti i valori dei colori dei pixel della variabile immagine:
 st = Memory im.Data For Read
 
 For j = 0 To (im.H * im.W * fo) - 1   ' La dimensione in byte effettiva di un'immagine si ottiene moltiplicando i pixel per la quantità di byte che compongono un singolo pixel (formato dei pixel)
   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.Image = im

End


Puntando all'area di memoria della variabile di tipo Image

Nei precedenti due paragrafi abbiamo visto come Gambas mediante la proprietà ".Data" della Classe Image consenta di puntare alla sub-area di memoria di una variabile di tipo Image, e di leggere i valori corrispondenti ai colori dei pixel dell'immagine.

L'accesso a tale sub-area di memoria dell'area principale di memoria di una variabile di tipo Image può essere effettuato anche direttamente mediante i Puntatori e la dereferenzianzione dei medesimi.
Sappiamo, come già detto, che i valori dei colori dei pixel di una variabile di tipo Image sono contenuti in una specifica area di memoria riservata, il cui indirizzo è indicato al 17° byte (indice 16) dell'area di memoria principale della predetta variabile di tipo Image.

Mostriamo un esempio pratico, nel quale si userà la funzione di dereferenziazione "Byte@()":

Public Sub Form_Open()

 Dim im As Image
 Dim p1, p2 As Pointer
 Dim i As Integer
 
 im = Image.Load("/percorso/del/file/immagine")
  
 p1 = Object.Address(im)
 p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
  
 For i = 0 To (im.W * im.H * (im.Depth / 8)) - 1
   Print i, Hex(Byte@(p2 + i), 2)
 Next 
  
End


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

Questa 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


Note

[1] Per analogia di argomento si segnala anche la pagina: Individuare il colore di un determinato pixel.