Differenze tra le versioni di "Gestire un oggetto Image agendo direttamente sulle risorse dei sorgenti Gambas"

Da Gambas-it.org - Wikipedia.
 
(7 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
I dati di un oggetto di tipo ''Image'' sono gestiti mediante alcune risorse presenti nei file sorgenti "''gb.image.h''" e "''gambas.h''". In particolare i dati di un oggetto ''Image'' sono immagazzinati nella Struttura ''GB_IMG'', scritta in C, presente nel predetto file ''gb.image.h'', e che qui mostriamo:
+
I dati di un oggetto di tipo ''Image'' sono gestiti mediante alcune risorse presenti nei file sorgenti "''gb.image.h'' " e "''gambas.h'' ". <SUP>&#091;[[#Note|Nota 1]]&#093;</sup>
 +
<BR>In particolare i dati di un oggetto ''Image'' sono immagazzinati nella Struttura ''GB_IMG'', scritta in C, presente nel predetto file ''gb.image.h'', e che qui mostriamo:
 
  typedef
 
  typedef
 
         struct GB_IMG {
 
         struct GB_IMG {
                 GB_BASE ob;                              // <FONT Color=gray>la Struttura di riferimento del membro "ob" è: "typedef struct _CLASS", contenuta nel file header "gbx_class.h", riga 250</font>
+
                 GB_BASE ob;                              // <FONT Color=gray>la Struttura di riferimento del membro "ob" è: "typedef struct _CLASS", contenuta nel file header "''gbx_class.h''", riga 250</font>
 
                 unsigned char *data;                      // points at the image data
 
                 unsigned char *data;                      // points at the image data
 
                 int width;                                // image width in pixels
 
                 int width;                                // image width in pixels
 
                 int height;                              // image height in pixels
 
                 int height;                              // image height in pixels
                 int format;                              // image format (RGB, BGR, RGBA...)
+
                 int format;                              // image format (RGB, BGR, RGBA...)   <FONT Color=gray>Vedi l'elenco sotto il paragrafo "''Constants used by image data format''" nel file header ''"gb.image.h"''</font>
 
                 GB_IMG_OWNER *owner;                      // owner of the data, NULL means gb.image
 
                 GB_IMG_OWNER *owner;                      // owner of the data, NULL means gb.image
 
                 void *owner_handle;                      // handle for the owner
 
                 void *owner_handle;                      // handle for the owner
Riga 27: Riga 28:
 
   Dim spost As Integer
 
   Dim spost As Integer
 
      
 
      
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
        
 
        
 
  <FONT Color=gray>' ''Punta all'oggetto "Image":''</font>
 
  <FONT Color=gray>' ''Punta all'oggetto "Image":''</font>
  p1 = Object.Address(im)
+
  p1 = Object.Address(im)
 
    
 
    
  spost = SizeOf(gb.Pointer) * 3
+
  spost = SizeOf(gb.Pointer) * 3
 
    
 
    
 
  <FONT Color=gray>' ''Punta al dato relativo al tipo di oggetto (ossia: "Image"):''</font>
 
  <FONT Color=gray>' ''Punta al dato relativo al tipo di oggetto (ossia: "Image"):''</font>
  Print String@(Pointer@(Pointer@(p1) + spost))
+
  Print String@(Pointer@(Pointer@(p1) + spost))
 
    
 
    
 
  <FONT Color=gray>' ''Punta al dato relativo alla larghezza dell'immagine in pixel:''</font>
 
  <FONT Color=gray>' ''Punta al dato relativo alla larghezza dell'immagine in pixel:''</font>
  Print Int@(p1 + spost); " pixel"
+
  Print Int@(p1 + spost); " pixel"
 
    
 
    
 
  <FONT Color=gray>' ''Punta al dato relativo all'altezza dell'immagine in pixel:''</font>
 
  <FONT Color=gray>' ''Punta al dato relativo all'altezza dell'immagine in pixel:''</font>
  Print Int@(p1 + spost + 4); " pixel"
+
  Print Int@(p1 + spost + 4); " pixel"
 
    
 
    
 
  <FONT Color=gray>' ''Punta al dato relativo al formato dell'immagine:''</font>
 
  <FONT Color=gray>' ''Punta al dato relativo al formato dell'immagine:''</font>
  Print Int@(p1 + spost + 8)
+
  Print Int@(p1 + spost + 8)
 
    
 
    
 
  <FONT Color=gray>' ''Punta al dato relativo al corrente Componente di Gambas che sta gestendo l'oggetto "Image":''</font>
 
  <FONT Color=gray>' ''Punta al dato relativo al corrente Componente di Gambas che sta gestendo l'oggetto "Image":''</font>
  Print String@(Pointer@(Pointer@(p1 + (SizeOf(gb.Pointer) * 5))))
+
  Print String@(Pointer@(Pointer@(p1 + (SizeOf(gb.Pointer) * 5))))
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 61: Riga 62:
 
   Dim st As Stream
 
   Dim st As Stream
 
    
 
    
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
 
        
 
        
 
  <FONT Color=gray>' ''Punta all'oggetto "Image":''</font>
 
  <FONT Color=gray>' ''Punta all'oggetto "Image":''</font>
  p1 = Object.Address(im)
+
  p1 = Object.Address(im)
 
    
 
    
 
  <FONT Color=gray>' ''Punta all'area di memoria (puntata dal membro "*data" della Struttura ''GB_IMG'') dei dati che rappresentano ai pixel dell'immagine:''</font>
 
  <FONT Color=gray>' ''Punta all'area di memoria (puntata dal membro "*data" della Struttura ''GB_IMG'') dei dati che rappresentano ai pixel dell'immagine:''</font>
  p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
+
  p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
 
    
 
    
 
  <FONT Color=gray>' ''Utilizziamo ovviamente i "Memory Stream" per scrivere nell'area di memoria puntata dal "Puntatore":''</font>
 
  <FONT Color=gray>' ''Utilizziamo ovviamente i "Memory Stream" per scrivere nell'area di memoria puntata dal "Puntatore":''</font>
  st = Memory p2 For Write
+
  st = Memory p2 For Write
 
    
 
    
  <FONT Color=gray>' ''Modifichiamo il primo pixel, che è quello posto nell'angolo in alto a sinistra, scrivendo il valore''
+
  <FONT Color=gray>' ''Modifichiamo il primo pixel, che è quello posto nell'angolo in alto a sinistra dell'immagine, scrivendo il valore corrispondente al colore "giallo", ed avendo cura di porre il canale "alfa" (primo byte a sinistra) al valore massimo 255 (&FF).''</font> <SUP>&#091;[[#Note|Nota 2]]&#093;</sup>
' ''corrispondente al colore "giallo", ed avendo cura di porre il canale "alfa" (primo byte a sinistra) al valore massimo 255 (&FF).''
+
  Write #st, &<FONT Color=#B22222>FF</font>00FFFF As Integer
' ''Va considerato che in questo caso la disposizione dei byte della rappresentazione esadecimale del valore dei colori è invertita !''</font>
+
  st.Close
  Write #st, &FF00FFFF As Integer
 
  st.Close
 
 
   
 
   
 
  <FONT Color=gray>' ''Verifichiamo l'avvenuta scrittura/modifica leggendo il valore del primo pixel:''</font>
 
  <FONT Color=gray>' ''Verifichiamo l'avvenuta scrittura/modifica leggendo il valore del primo pixel:''</font>
  Print Hex(Int@(p2), 8)
+
  Print Hex(Int@(p2), 8)
 
   
 
   
 
  <FONT Color=gray>' ''Verifichiamo l'avvenuta scrittura/modifica, inoltre, mostrando l'immagine in una "PictureBox" e salvandola in nuovo file immagine:''</font>
 
  <FONT Color=gray>' ''Verifichiamo l'avvenuta scrittura/modifica, inoltre, mostrando l'immagine in una "PictureBox" e salvandola in nuovo file immagine:''</font>
  PictureBox1.Picture = im.Picture
+
  PictureBox1.Picture = im.Picture
  im.Save("/tmp/immagine.png", 100)
+
  im.Save("/tmp/immagine.png", 100)
 
    
 
    
 
  '''End'''
 
  '''End'''
 
  
  
Riga 94: Riga 92:
 
* [http://www.gambas-it.org/wiki/index.php?title=Configurazione,_organizzazione_ed_impostazione_dell%27oggetto_Image_secondo_i_sorgenti_di_Gambas Configurazione, organizzazione ed impostazione dell'oggetto Image secondo i sorgenti di Gambas]
 
* [http://www.gambas-it.org/wiki/index.php?title=Configurazione,_organizzazione_ed_impostazione_dell%27oggetto_Image_secondo_i_sorgenti_di_Gambas Configurazione, organizzazione ed impostazione dell'oggetto Image secondo i sorgenti di Gambas]
 
* [http://www.gambas-it.org/wiki/index.php?title=Leggere_le_informazioni_di_una_Image_dalle_sue_risorse_dei_sorgenti_di_Gambas Leggere le informazioni di una Image dalle sue risorse dei sorgenti di Gambas]
 
* [http://www.gambas-it.org/wiki/index.php?title=Leggere_le_informazioni_di_una_Image_dalle_sue_risorse_dei_sorgenti_di_Gambas Leggere le informazioni di una Image dalle sue risorse dei sorgenti di Gambas]
 +
 +
[2] Vedere anche: https://gambaswiki.org/wiki/doc/imageconv

Versione attuale delle 21:09, 24 nov 2021

I dati di un oggetto di tipo Image sono gestiti mediante alcune risorse presenti nei file sorgenti "gb.image.h " e "gambas.h ". [Nota 1]
In particolare i dati di un oggetto Image sono immagazzinati nella Struttura GB_IMG, scritta in C, presente nel predetto file gb.image.h, e che qui mostriamo:

typedef
       struct GB_IMG {
               GB_BASE ob;                               // la Struttura di riferimento del membro "ob" è: "typedef struct _CLASS", contenuta nel file header "gbx_class.h", riga 250
               unsigned char *data;                      // points at the image data
               int width;                                // image width in pixels
               int height;                               // image height in pixels
               int format;                               // image format (RGB, BGR, RGBA...)   Vedi l'elenco sotto il paragrafo "Constants used by image data format" nel file header "gb.image.h"
               GB_IMG_OWNER *owner;                      // owner of the data, NULL means gb.image
               void *owner_handle;                       // handle for the owner
               GB_IMG_OWNER *temp_owner;                 // owner of the temporary handle that does not own the data
               void *temp_handle;                        // temporary handle
               unsigned modified : 1;                    // data has been modified by gb.image
               unsigned sync : 1;                        // data must be synchronized by calling GB_IMG_OWNER.sync()
               unsigned is_void : 1;                     // void image (no data)
               }
       GB_IMG;

Agendo - in lettura ed in scrittura - su questa Struttura, possiamo ottenere dati dall'immagine o scriverne nuovi, così modificandola.


Lettura dei dati

Di seguito mostriamo un semplice esempio, nel quale leggeremo alcuni dati di una immagine agendo sull'area di memoria della predetta Struttura GB_IMG:

 Public Sub Form_Open()

 Dim im As Image
 Dim p1, p2 As Pointer
 Dim spost As Integer
   
 im = Image.Load("/percorso/del/file/immagine")
     
' Punta all'oggetto "Image":
 p1 = Object.Address(im)
  
 spost = SizeOf(gb.Pointer) * 3
  
' Punta al dato relativo al tipo di oggetto (ossia: "Image"):
 Print String@(Pointer@(Pointer@(p1) + spost))
  
' Punta al dato relativo alla larghezza dell'immagine in pixel:
 Print Int@(p1 + spost); " pixel"
  
' Punta al dato relativo all'altezza dell'immagine in pixel:
 Print Int@(p1 + spost + 4); " pixel"
  
' Punta al dato relativo al formato dell'immagine:
 Print Int@(p1 + spost + 8)
  
' Punta al dato relativo al corrente Componente di Gambas che sta gestendo l'oggetto "Image":
 Print String@(Pointer@(Pointer@(p1 + (SizeOf(gb.Pointer) * 5))))
  
End


Scrittura dei dati

In questo esempio, invece, procederemo a scrivere dei valori nell'area di memoria puntata dal membro "unsigned char *data" della Struttura GB_IMG, modificando così il colore dei pixel dell'immagine caricata:

Public Sub Form_Open()

 Dim im As Image
 Dim p1, p2 As Pointer
 Dim st As Stream
 
 im = Image.Load("/percorso/del/file/immagine")
     
' Punta all'oggetto "Image":
 p1 = Object.Address(im)
  
' Punta all'area di memoria (puntata dal membro "*data" della Struttura GB_IMG) dei dati che rappresentano ai pixel dell'immagine:
 p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
  
' Utilizziamo ovviamente i "Memory Stream" per scrivere nell'area di memoria puntata dal "Puntatore":
 st = Memory p2 For Write
  
' Modifichiamo il primo pixel, che è quello posto nell'angolo in alto a sinistra dell'immagine, scrivendo il valore corrispondente al colore "giallo", ed avendo cura di porre il canale "alfa" (primo byte a sinistra) al valore massimo 255 (&FF). [Nota 2]
 Write #st, &FF00FFFF As Integer
 st.Close

' Verifichiamo l'avvenuta scrittura/modifica leggendo il valore del primo pixel:
 Print Hex(Int@(p2), 8)

' Verifichiamo l'avvenuta scrittura/modifica, inoltre, mostrando l'immagine in una "PictureBox" e salvandola in nuovo file immagine:
 PictureBox1.Picture = im.Picture
 im.Save("/tmp/immagine.png", 100)
  
End


Note

[1] Si rinvia per identico argomento alle seguenti pagine della WIKI:

[2] Vedere anche: https://gambaswiki.org/wiki/doc/imageconv