Differenze tra le versioni di "Modificare i colori dei pixel di un'immagine con la proprietà .Data della Classe Image ed i Memory Stream"

Da Gambas-it.org - Wikipedia.
 
(3 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
E' possibile modificare i colori dei pixel di un'immagine utilizzando la proprietà ''.Data'' della Classe ''Image'' ed i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]''. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
 
E' possibile modificare i colori dei pixel di un'immagine utilizzando la proprietà ''.Data'' della Classe ''Image'' ed i ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]''. <SUP>&#091;[[#Note|nota 1]]&#093;</sup>
  
La proprietà ''.Data'' della Classe ''Image'' ritorna un ''Puntatore'' ai dati della variabile di tipo ''Image''. Si potrà, quindi, per mezzo dei ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' leggere all'interno dell'area puntata dal predetto ''Puntatore''.
+
La Proprietà ".Data" della Classe ''Image'' ritorna un ''Puntatore'' ai dati della variabile di tipo ''Image''. Si potrà, quindi, per mezzo dei ''[[Definizione_ed_uso_dei_Memory_Stream|Memory Stream]]'' 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.
 
<BR>Sarà possibile altresì scrivervi modificando quindi il colore di uno o di più pixel dell'immagine.
  
 
+
===Esempi===
 
Nell'esempio che segue abbiamo una semplice immagine formata da 8x8 pixel tutti di colore giallo, che saranno mostrati in una "PictureBox" all'apertura del "Form".
 
Nell'esempio che segue abbiamo una semplice immagine formata da 8x8 pixel tutti di colore giallo, che saranno mostrati in una "PictureBox" all'apertura del "Form".
 
Cliccando sul tasto (da porre anch'esso sul "Form") si cambierà in rosso il colore del secondo pixel (che corrisponde graficamente al secondo pixel da sinistra della prima fila in alto dell'immagine).
 
Cliccando sul tasto (da porre anch'esso sul "Form") si cambierà in rosso il colore del secondo pixel (che corrisponde graficamente al secondo pixel da sinistra della prima fila in alto dell'immagine).
Riga 10: Riga 10:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
  im = New Image(8, 8, Color.Yellow, Image.Standard)
+
  im = New Image(8, 8, Color.Yellow, Image.Standard)
 
    
 
    
  With PictureBox1
+
  With PictureBox1
    .W = im.W
+
    .W = im.W
    .H = im.H
+
    .H = im.H
  End With
+
  End With
 
    
 
    
  PictureBox1.Picture = im.Picture
+
  PictureBox1.Picture = im.Picture
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
   
 
   
 
   Dim st As Stream
 
   Dim st As Stream
Riga 34: Riga 34:
 
    
 
    
 
   Print "Dati dell'immagine originale:"
 
   Print "Dati dell'immagine originale:"
  For j = 0 To (im.H * im.W * (im.Depth / 8)) - 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>
+
<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>
 +
  For j = 0 To (im.H * im.W * (im.Depth / 8)) - 1
 
     Read #st, b
 
     Read #st, b
 
     If j Mod (im.Depth \ 8) == 0 Then Print "------------------"
 
     If j Mod (im.Depth \ 8) == 0 Then Print "------------------"
Riga 61: Riga 62:
 
   PictureBox1.Picture = im.Picture
 
   PictureBox1.Picture = im.Picture
 
    
 
    
  '''End'''
+
  End
  
  
 
Di seguito un altro esempio pratico, nel quale:
 
Di seguito un altro esempio pratico, nel quale:
* sarà creato un Oggetto di tipo "Image" di dimensioni 3x3 pixel;
+
* sarà creato un Oggetto di tipo ''Image'' di dimensioni 3x3 pixel interamente di colore rosso;
* l'immagine sarà colorata di rosso;
 
 
* sarà modificato il pixel, che appare come centrale nell'immagine visiva, ossia il 5° pixel, assegnandogli la massima trasparenza (canale Alfa = &h00).
 
* sarà modificato il pixel, che appare come centrale nell'immagine visiva, ossia il 5° pixel, assegnandogli la massima trasparenza (canale Alfa = &h00).
E' necessario attivare anche i Componenti di Gambas ''gb.image'' e ''gb.image.io'' .
+
  Public Sub Button1_Click()
  '''Public''' Sub Main()
+
 
 
 
   Dim im As Image
 
   Dim im As Image
 
   Dim st As Stream
 
   Dim st As Stream
 
    
 
    
  <FONT Color=gray>' ''Crea un Oggetto "Image" di dimensioni 3x3 pixel:''</font>
+
  <FONT Color=gray>' ''Crea un Oggetto "Image" di dimensioni 3x3 pixel di colore rosso:''</font>
  im = New Image(3, 3)
+
  im = New Image(3, 3, Color.Red, Image.Standard)
 
 
<FONT Color=gray>' ''Colora l'intera immagine di rosso:''</font>
 
  im = im.Fill(Color.Red)
 
 
    
 
    
 
  <FONT Color=gray>' ''Viene salvata questa "prima" versione dell'immagine creata, interamente colorata di rosso:''</font>
 
  <FONT Color=gray>' ''Viene salvata questa "prima" versione dell'immagine creata, interamente colorata di rosso:''</font>
  im.Save("/tmp/prima.png", 100)
+
  im.Save("/tmp/prima_versione.png", 100)
 
    
 
    
 
  <FONT Color=gray>' ''Con i "Memory Stream" accede alla memoria dell'Oggetto di tipo "image"' mediante la proprietà ".Data" della sua corrispondente variabile.''
 
  <FONT Color=gray>' ''Con i "Memory Stream" accede alla memoria dell'Oggetto di tipo "image"' mediante la proprietà ".Data" della sua corrispondente variabile.''
  ' ''In particolare la proprietà ".Data" dell'Oggetto "Image" è sostanzialmente un Puntatore, giacché essa restituisce l'indirizzo di memoria dell'area,''
+
  ' ''In particolare la proprietà ".Data" dell'Oggetto "Image" è sostanzialmente un Puntatore, giacché essa restituisce l'indirizzo di memoria dell'area, ove tale Oggetto conserva i dati afferenti ai pixel dell'immagine.''</font>
' ''ove tale Oggetto conserva i dati afferenti ai pixel dell'immagine.''</font>
+
  st = Memory im.Data For Write
  st = Memory im.Data For Write
 
 
    
 
    
 
  <FONT Color=gray>' ''Individua il byte di memoria, ove hanno inizio i valori del pixel, al quale modificare i valori.''
 
  <FONT Color=gray>' ''Individua il byte di memoria, ove hanno inizio i valori del pixel, al quale modificare i valori.''
 
  ' ''Il byte di memoria va individuato tenendo conto del "formato" dell'immagine, ossia di quanti byte è formato un singolo pixel, moltiplicato per il numero indicizzato del pixel da modificare.''</font>
 
  ' ''Il byte di memoria va individuato tenendo conto del "formato" dell'immagine, ossia di quanti byte è formato un singolo pixel, moltiplicato per il numero indicizzato del pixel da modificare.''</font>
  Seek #st, (im.Depth / 8) * (im.Depth / 8)
+
  Seek #st, (im.Depth / 8) * (im.Depth / 8)
 
    
 
    
 
  <FONT Color=gray>' ''Scrive nella porzione, come sopra individuata, di memoria il nuovo valore del pixel interessato.''
 
  <FONT Color=gray>' ''Scrive nella porzione, come sopra individuata, di memoria il nuovo valore del pixel interessato.''
 
  ' ''Per attribuire la trasparenza, il byte (del pixel) corrispondente al canale "Alfa" dovrà essere impostato a zero.''</font>
 
  ' ''Per attribuire la trasparenza, il byte (del pixel) corrispondente al canale "Alfa" dovrà essere impostato a zero.''</font>
  Write #st, 0 As Integer
+
  Write #st, 0 As Integer
  st.Close
+
  st.Close
 
    
 
    
 
  <FONT Color=gray>' ''Salva l'immagine per andarla a vedere:''</font>
 
  <FONT Color=gray>' ''Salva l'immagine per andarla a vedere:''</font>
  im.Save("/tmp/con_pixel_centrale_trasparente.png", 100)
+
  im.Save("/tmp/immagine_con_pixel_centrale_trasparente.png", 100)
 
+
  '''End'''
+
  End
  
  
  
 
=Note=
 
=Note=
[1] Vedi anche la pagina: [[Creare_un'immagine_senza_avere_un_file_immagine|Creare un'immagine senza avere un file immagine]]
+
[1] Vedi anche la pagina: [[Creare un'immagine senza avere un file immagine]]

Versione attuale delle 05:49, 20 nov 2023

E' possibile modificare i colori dei pixel di un'immagine utilizzando la proprietà .Data della Classe Image ed i Memory Stream. [nota 1]

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.

Esempi

Nell'esempio che segue abbiamo una semplice immagine formata da 8x8 pixel tutti di colore giallo, che saranno mostrati in una "PictureBox" all'apertura del "Form". Cliccando sul tasto (da porre anch'esso sul "Form") si cambierà in rosso il colore del secondo pixel (che corrisponde graficamente al secondo pixel da sinistra della prima fila in alto dell'immagine).

Private im As Image


Public Sub Form_Open()
 
 im = New Image(8, 8, Color.Yellow, Image.Standard)
  
 With PictureBox1
   .W = im.W
   .H = im.H
 End With
  
 PictureBox1.Picture = im.Picture
  
End


Public Sub Button1_Click()

 Dim st As Stream
 Dim b As Byte
 Dim j As Integer
 
' Viene dereferenziato il "Puntatore", mostrando così tutti i valori dei colori dei pixel della variabile immagine:
 st = Memory im.Data For Read Write
 
 Print "Dati dell'immagine originale:"
' 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).
 For j = 0 To (im.H * im.W * (im.Depth / 8)) - 1
   Read #st, b
   If j Mod (im.Depth \ 8) == 0 Then Print "------------------"
   Print j, Hex(b, 2)
 Next

 Print "\n------------------\nDati dell'immagine modificata:"

' Viene individuato il 2° pixel (si deve tenere bene in conto del formato dell'immagine !) per la mdifica del suo colore:
 Seek #st, 1 * (im.Depth / 8)
  
' Viene cambiato il colore del secondo pixel da giallo in rosso (se il formato è "diverso" dal "BGR", allora il primo byte a sinistra è relativo al valore "alfa" !):
 Write #st, &FFFF0000 As Integer
  
' Vengono nuovamente letti i valori dei colori dopo la modifica del 2° pixel:
 Seek #st, 0
 For j = 0 To (im.H * im.W * (im.Depth / 8)) - 1
   Read #st, b
   If j Mod (im.Depth \ 8) == 0 Then Print "------------------"
   Print j, Hex(b, 2)
 Next

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


Di seguito un altro esempio pratico, nel quale:

  • sarà creato un Oggetto di tipo Image di dimensioni 3x3 pixel interamente di colore rosso;
  • sarà modificato il pixel, che appare come centrale nell'immagine visiva, ossia il 5° pixel, assegnandogli la massima trasparenza (canale Alfa = &h00).
Public Sub Button1_Click()

 Dim im As Image
 Dim st As Stream
 
' Crea un Oggetto "Image" di dimensioni 3x3 pixel di colore rosso:
 im = New Image(3, 3, Color.Red, Image.Standard)
  
' Viene salvata questa "prima" versione dell'immagine creata, interamente colorata di rosso:
 im.Save("/tmp/prima_versione.png", 100)
  
' Con i "Memory Stream" accede alla memoria dell'Oggetto di tipo "image"' mediante la proprietà ".Data" della sua corrispondente variabile.
' In particolare la proprietà ".Data" dell'Oggetto "Image" è sostanzialmente un Puntatore, giacché essa restituisce l'indirizzo di memoria dell'area, ove tale Oggetto conserva i dati afferenti ai pixel dell'immagine.
 st = Memory im.Data For Write
  
' Individua il byte di memoria, ove hanno inizio i valori del pixel, al quale modificare i valori.
' Il byte di memoria va individuato tenendo conto del "formato" dell'immagine, ossia di quanti byte è formato un singolo pixel, moltiplicato per il numero indicizzato del pixel da modificare.
 Seek #st, (im.Depth / 8) * (im.Depth / 8)
  
' Scrive nella porzione, come sopra individuata, di memoria il nuovo valore del pixel interessato.
' Per attribuire la trasparenza, il byte (del pixel) corrispondente al canale "Alfa" dovrà essere impostato a zero.
 Write #st, 0 As Integer
 st.Close
  
' Salva l'immagine per andarla a vedere:
 im.Save("/tmp/immagine_con_pixel_centrale_trasparente.png", 100)

End


Note

[1] Vedi anche la pagina: Creare un'immagine senza avere un file immagine