Differenze tra le versioni di "Individuare i colori dei pixel di una immagine"
(27 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 | + | ==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''=== | |
− | === | + | 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 del colore di un pixel dell'immagine. | ||
Esempio: | Esempio: | ||
Riga 11: | Riga 12: | ||
Dim im As Image | Dim im As Image | ||
− | Dim | + | Dim i As Integer |
− | + | im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | |
− | + | For Each i In im.Pixels | |
− | + | Print Hex(i, 8) | |
− | + | Next | |
− | |||
'''End''' | '''End''' | ||
− | === | + | ===Uso della Proprietà ".Data" della Classe ''Image'' e le funzioni di dereferenziazione=== |
− | La proprietà | + | 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("<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''' | ||
+ | |||
− | Nell'esempio che segue | + | ===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() | '''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 | ||
− | |||
− | + | im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | |
− | + | 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 | |
− | + | 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 | |
− | + | ||
− | + | st.Close | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<FONT Color=gray>' ''Mostra l'immagine come modificata:''</font> | <FONT Color=gray>' ''Mostra l'immagine come modificata:''</font> | ||
− | + | PictureBox1.Image = im | |
'''End''' | '''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. | |
− | Image | + | |
+ | 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 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("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | ||
+ | |||
+ | 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: | Esempio: | ||
'''Public''' Sub Form_Open() | '''Public''' Sub Form_Open() | ||
Riga 98: | Riga 122: | ||
Dim im As Image | Dim im As Image | ||
− | + | im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | |
− | + | For x = 0 To im.W - 1 | |
− | + | For y = 0 To im.h - 1 | |
− | + | Print Hex$(im[x, y], 6) | |
− | + | 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 j As Byte | |
− | + | ' Dim im As Image | |
− | + | ' | |
− | + | ' im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | |
− | + | ' | |
− | + | ' For j = 0 To im.W * im.H - 1 | |
− | + | ' Print Hex$(im[vett[j], vett[j + 4]], 6) | |
− | + | ' Next</font> | |
'''End''' | '''End''' | ||
− | Per analogia | + | |
+ | |||
+ | |||
+ | =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
Indice
- 1 Individuare i colori dei pixel di una immagine mediante le risorse native di Gambas
- 1.1 Uso della Proprietà ".Pixels" della Classe Image
- 1.2 Uso della Proprietà ".Data" della Classe Image e le funzioni di dereferenziazione
- 1.3 Uso della Proprietà ".Data" della Classe Image ed i Memory Stream
- 1.4 Puntando all'area di memoria della variabile di tipo Image
- 1.5 Individuando il colore di ciascun pixel mediante le sue coordinate x ed y
- 2 Note
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.