Differenze tra le versioni di "Configurazione, organizzazione ed impostazione dell'oggetto Image secondo i sorgenti di Gambas"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Per la creazione di una ''Image'', non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati immagine in essa contenuti, ma, essendo anche un ''Oggetto...")
 
 
(14 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per la creazione di una ''Image'', non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati immagine in essa contenuti, ma, essendo anche un ''Oggetto'' di Gambas, si innesca una procedura più complessa che coinvolge più ''Strutture'' di dati a livello dei sorgenti di Gambas, e quindi diversi byte di memoria da occupare.
+
Per la creazione di una "Image", non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati immagine in essa contenuti, ma, essendo anche un "Oggetto" di Gambas, si innesca una procedura più complessa che coinvolge più "Strutture" di dati a livello dei sorgenti di Gambas, e quindi diversi byte di memoria da occupare.
  
Tali risorse, insomma, servono sia per definire alcune caratteristiche generali dell'oggetto ''Image'', sia per memorizzare i dati immagine che essa contiene.
+
Tali risorse, insomma, servono sia per definire alcune caratteristiche generali dell'oggetto "Image", sia per memorizzare i dati immagine che essa contiene.
  
Vediamo, dunque, cosa avviene, appunto, a livello dei sorgenti di Gambas e quali loro risorse in particolare vengono richiamate e usate per creare e gestire una ''Image''.
+
Vediamo, dunque, cosa avviene, appunto, a livello dei sorgenti di Gambas e quali loro risorse in particolare vengono richiamate e usate per creare e gestire una "Image".
  
La memorizzazione, dunque, dei dati immagine e di alcune caratteristiche dell'immagine caricata nell'ooggetto ''Image'', avviene attraverso l'utilizzo di una ''Struttura'', chiamata "''GB_IMB''", così dichiarata nel file sorgente "''.../main/lib/image/gb.image.h''":
+
La memorizzazione, dunque, dei dati immagine e di alcune caratteristiche dell'immagine caricata nell'Oggetto "Image", avviene attraverso l'utilizzo di una "Struttura", chiamata "''GB_IMB'' ", così dichiarata nel file sorgente "''.../main/lib/image/gb.image.h'' ":
 
  typedef
 
  typedef
 
         struct GB_IMG {
 
         struct GB_IMG {
Riga 31: Riga 31:
  
 
==Accedere e leggere nella Struttura ''GB_IMG''==
 
==Accedere e leggere nella Struttura ''GB_IMG''==
E' possibile da un progetto Gambas penetrare nella Struttura ''GB_IMG'' e leggere i dati contenuti in alcune suoi membri mediante due modalità che mostriamo di seguito.
+
E' possibile da un progetto Gambas penetrare nella Struttura "''GB_IMG'' " e leggere i dati contenuti in alcuni suoi membri mediante due modalità che mostriamo di seguito.
 
 
  
 
===Utilizzare solo Puntatori===
 
===Utilizzare solo Puntatori===
Questa prima modalità prevede l'uso dei soli Puntatori per accedere e muoversi all'interno dell'area di memoria della Struttura ''GB_IMG'', e dunque leggere i dati contenuti nei membri che ci interessano:
+
Questa prima modalità prevede l'uso dei soli Puntatori per accedere e muoversi all'interno dell'area di memoria della Struttura "''GB_IMG'' ", e dunque leggere i dati contenuti nei membri che ci interessano.
'''Public''' Sub Main()
+
<BR>(E' necessario attivare il Componente "gb.image.io"; e si suggerisce di utilizzare una immagine di dimensione più piccola possibile per non congestionare la scrittura dei dati immagine grezzi in console. Inoltre, l'esempio funziona con sistema a 64-bit !).
 +
Public Sub Main()
 
    
 
    
 
   Dim im As Image
 
   Dim im As Image
Riga 44: Riga 44:
 
   Dim w, h, i, n As Integer
 
   Dim w, h, i, n As Integer
 
    
 
    
  im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>")
+
  im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>")
 
      
 
      
  p1 = Object.Address(im)
+
  p1 = Object.Address(im)
 
      
 
      
  <FONT Color=gray>'' 'Accede alla Struttura CLASS''</font>
+
  <FONT Color=gray>' ''Accede alla Struttura CLASS''</font>
  p2 = Pointer@(p1)
+
  p2 = Pointer@(p1)
      p3 = Pointer@(p2 + 24)
+
  p3 = Pointer@(p2 + (SizeOf(gb.Pointer) * 3))
      s = String@(p3)
+
  s = String@(p3)
      Print s
+
  Print s
 
        
 
        
  <FONT Color=gray>'' 'Dereferenzia il membro "int width"''</font>
+
  <FONT Color=gray>' ''Dereferenzia il membro "int width"''</font>
  w = Int@(p1 + 24)
+
  w = Int@(p1 + 24)
  Print w
+
  Print w
 
      
 
      
  <FONT Color=gray>'' 'Dereferenzia il membro "int height"''</font>
+
  <FONT Color=gray>' ''Dereferenzia il membro "int height"''</font>
  h = Int@(p1 + 28)
+
  h = Int@(p1 + 28)
  Print h
+
  Print h
 
      
 
      
  <FONT Color=gray>'' 'Dereferenzia il membro "int format"''</font>
+
  <FONT Color=gray>' ''Dereferenzia il membro "int format"''</font>
  i = Int@(p1 + 32)
+
  i = Int@(p1 + 32)
  Print i
+
  Print i
  If (i < 4) Or (i > 5) Then i = 4
+
  If (i < 4) Or (i > 5) Then i = 4
 
      
 
      
  <FONT Color=gray>'' 'Accede all'area di memoria puntata dal membro "unsigned char *data"''</font>
+
  <FONT Color=gray>' ''Accede all'area di memoria puntata dal membro "unsigned char *data"''</font>
  p2 = Pointer@(p1 + 16)
+
  p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
  <FONT Color=gray>'' 'Dereferenzia ogni dato puntato in quel momento del ciclo dal membro "unsigned char *data"''</font>
+
  <FONT Color=gray>' ''Dereferenzia ogni dato puntato in quel momento del ciclo dal Puntatore''</font>
  For n = 0 To (w * h * i) - 1
+
  For n = 0 To (w * h * i) - 1
    Print Hex(Byte@(p2 + n), 2),
+
    Print Hex(Byte@(p2 + n), 2),
    If (n + 1) Mod 4 = 0 Then Print
+
    If (n + 1) Mod 4 = 0 Then Print
  Next
+
  Next
 
    
 
    
  '''End'''
+
  End
 
 
 
 
  
  
 +
===Utilizzare anche una Struttura dichiarata in Gambas===
 +
La seconda modalità prevede, invece, l'uso di un Puntatore per il solo accesso all'area di memoria della Struttura, e la successiva assegnazione di tale Puntatore ad una Struttura dichiarata nel progetto Gambas di dimensioni e configurazione simili alla Struttura "''GB_IMG'' ".
 +
<BR>(E' necessario attivare il Componente "gb.image.io"; e si suggerisce di utilizzare una immagine di dimensione più piccola possibile per non congestionare la scrittura dei dati immagine grezzi in console).
 +
Public Struct GB_BASE  <FONT Color=gray>' ''Riproduce la Struttura annidata 'GB_BASE'''</font>
 +
  klass As Pointer
 +
  ref As Long
 +
End Struct
 +
 +
Public Struct GB_IMG    <FONT Color=gray>' ''Riproduce la Struttura 'GB_IMG'''</font>
 +
  ob As Struct GB_BASE
 +
  data As Pointer
 +
  width As Integer
 +
  height As Integer
 +
  format_ As Integer
 +
  owner As Pointer
 +
  owner_handle As Pointer
 +
  temp_owner As Pointer
 +
  temp_handle As Pointer
 +
  msi As Integer
 +
End Struct
 +
 +
 +
Public Sub Main()
 +
 
 +
  Dim im As Image
 +
  Dim p As Pointer
 +
  Dim img As GB_IMG
 +
  Dim i, n As Integer
 +
 
 +
  im = Image.Load("<FONT Color=darkgreen>''/percorso/del/file/immagine''</font>")
 +
   
 +
  p = Object.Address(im)
 +
   
 +
<FONT Color=gray>' ''Assegna il "Puntatore" alla Struttura ''GB_IMG'', così valorizzandola:''</font>
 +
  img = p
 +
 
 +
  With img
 +
    Print .width
 +
    Print .height
 +
    Print .format_
 +
    If (.format_ < 4) Or (.format_ > 5) Then i = 4
 +
    For n = 0 To (.width * .height * i) - 1
 +
      Print Hex(Byte@(.data + n), 2),
 +
      If (n + 1) Mod 4 = 0 Then Print
 +
    Next
 +
  End With
 +
 
 +
End
  
  
  
<FONT Color=red size=4><B>Pagina in costruzione !</b></font>
+
=Note=
 +
[1] Si rinvia per identico argomento alle seguenti pagine della WIKI:
 +
* [[Gestire un oggetto Image agendo direttamente sulle risorse dei sorgenti Gambas]]
 +
* [[Leggere le informazioni di una Image dalle sue risorse dei sorgenti di Gambas]]

Versione attuale delle 09:14, 6 gen 2024

Per la creazione di una "Image", non v'è la sola e semplice allocazione di memoria per la memorizzazione dei dati immagine in essa contenuti, ma, essendo anche un "Oggetto" di Gambas, si innesca una procedura più complessa che coinvolge più "Strutture" di dati a livello dei sorgenti di Gambas, e quindi diversi byte di memoria da occupare.

Tali risorse, insomma, servono sia per definire alcune caratteristiche generali dell'oggetto "Image", sia per memorizzare i dati immagine che essa contiene.

Vediamo, dunque, cosa avviene, appunto, a livello dei sorgenti di Gambas e quali loro risorse in particolare vengono richiamate e usate per creare e gestire una "Image".

La memorizzazione, dunque, dei dati immagine e di alcune caratteristiche dell'immagine caricata nell'Oggetto "Image", avviene attraverso l'utilizzo di una "Struttura", chiamata "GB_IMB ", così dichiarata nel file sorgente ".../main/lib/image/gb.image.h ":

typedef
       struct GB_IMG {
               GB_BASE ob;
               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...)
               GB_IMG_OWNER *owner;
               void *owner_handle;
               GB_IMG_OWNER *temp_owner;
               void *temp_handle;
               unsigned modified : 1;
               unsigned sync : 1;
               unsigned is_void : 1;
               }
       GB_IMG;

Laddove, con riferimento ai membri che ci interessano, abbiamo:

  • GB_BASE ob, rappresenta la Struttura GB_BASE, contenuta nel file sorgente ".../main/share/gambas.h" dell'Interprete. Il primo membro di tale Struttura GB_BASE è a sua volta un Puntatore alla Struttura chiamata CLASS e definita nel file sorgente ".../main/gbx/gbx_class.h".
  • unsigned char *data, rappresenta un Puntatore all'area di memoria contenente i dati grezzi dell'immagine caricata.
  • int width, è un Intero che rappresenta la dimensione in pixel della larghezza dell'immagine.
  • int height, è un Intero che rappresenta la dimensione in pixel dell'altezza dell'immagine.
  • int format, è un Intero che rappresenta il formato dell'immagine, come specificato nell'elenco delle definizioni del "Constants used by image data format", presente nel predetto file sorgente ".../main/lib/image/gb.image.h".


Accedere e leggere nella Struttura GB_IMG

E' possibile da un progetto Gambas penetrare nella Struttura "GB_IMG " e leggere i dati contenuti in alcuni suoi membri mediante due modalità che mostriamo di seguito.

Utilizzare solo Puntatori

Questa prima modalità prevede l'uso dei soli Puntatori per accedere e muoversi all'interno dell'area di memoria della Struttura "GB_IMG ", e dunque leggere i dati contenuti nei membri che ci interessano.
(E' necessario attivare il Componente "gb.image.io"; e si suggerisce di utilizzare una immagine di dimensione più piccola possibile per non congestionare la scrittura dei dati immagine grezzi in console. Inoltre, l'esempio funziona con sistema a 64-bit !).

Public Sub Main()
 
 Dim im As Image
 Dim p1, p2, p3 As Pointer
 Dim s As String
 Dim b As Byte
 Dim w, h, i, n As Integer
  
 im = Image.Load("/percorso/del/file/immagine")
   
 p1 = Object.Address(im)
   
' Accede alla Struttura CLASS
 p2 = Pointer@(p1)
 p3 = Pointer@(p2 + (SizeOf(gb.Pointer) * 3))
 s = String@(p3)
 Print s
     
' Dereferenzia il membro "int width"
 w = Int@(p1 + 24)
 Print w
   
' Dereferenzia il membro "int height"
 h = Int@(p1 + 28)
 Print h
   
' Dereferenzia il membro "int format"
 i = Int@(p1 + 32)
 Print i
 If (i < 4) Or (i > 5) Then i = 4
   
' Accede all'area di memoria puntata dal membro "unsigned char *data"
 p2 = Pointer@(p1 + (SizeOf(gb.Pointer) * 2))
' Dereferenzia ogni dato puntato in quel momento del ciclo dal Puntatore
 For n = 0 To (w * h * i) - 1
   Print Hex(Byte@(p2 + n), 2),
   If (n + 1) Mod 4 = 0 Then Print
 Next
  
End


Utilizzare anche una Struttura dichiarata in Gambas

La seconda modalità prevede, invece, l'uso di un Puntatore per il solo accesso all'area di memoria della Struttura, e la successiva assegnazione di tale Puntatore ad una Struttura dichiarata nel progetto Gambas di dimensioni e configurazione simili alla Struttura "GB_IMG ".
(E' necessario attivare il Componente "gb.image.io"; e si suggerisce di utilizzare una immagine di dimensione più piccola possibile per non congestionare la scrittura dei dati immagine grezzi in console).

Public Struct GB_BASE   ' Riproduce la Struttura annidata 'GB_BASE'
  klass As Pointer
  ref As Long
End Struct

Public Struct GB_IMG    ' Riproduce la Struttura 'GB_IMG'
  ob As Struct GB_BASE
  data As Pointer
  width As Integer
  height As Integer
  format_ As Integer
  owner As Pointer
  owner_handle As Pointer
  temp_owner As Pointer
  temp_handle As Pointer
  msi As Integer
End Struct


Public Sub Main()
 
 Dim im As Image
 Dim p As Pointer
 Dim img As GB_IMG
 Dim i, n As Integer
  
 im = Image.Load("/percorso/del/file/immagine")
   
 p = Object.Address(im)
   
' Assegna il "Puntatore" alla Struttura GB_IMG, così valorizzandola:
 img = p
  
 With img
   Print .width
   Print .height
   Print .format_
   If (.format_ < 4) Or (.format_ > 5) Then i = 4
   For n = 0 To (.width * .height * i) - 1
     Print Hex(Byte@(.data + n), 2),
     If (n + 1) Mod 4 = 0 Then Print
   Next
 End With
  
End


Note

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