Leggere le informazioni di una Image dalle sue risorse dei sorgenti di Gambas

Da Gambas-it.org - Wikipedia.

Quando viene istanziata e creata una "Image", essa occupa diversi byte di memoria per consentire la memorizzazione di vari dati informativi attinenti alla "Image" stessa. Tali dati vengono memorizzati in più aree di memoria riservata rappresentate da alcune Strutture e da semplici Puntatori.

La Struttura principale, che si riferisce ad una "Image", è la "Struttura" chiamata "GB_IMG ", contenuta nel file header "gb.image.h " e scritta in C:

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;           // 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;

I membri che qui ci interessano sono i primi sei.

Il primo membro della Struttura è un Puntatore ad un'altra Struttura, chiamata CLASS e contenuta nel file header gbx_class.h .
Il secondo membro è un Puntatore ad un'area di memoria riservata contenente i dati immagine grezzi.
Il terzo membro è un intero contenente un valore che rappresenta la larghezza in pixel dell'immagine.
Il quarto membro è un intero contenente un valore che rappresenta l'altezza in pixel dell'immagine.
Il quinto membro è un intero contenente un valore che rappresenta il formato in bit dell'immagine.
Il sesto membro è un Puntatore ad un'altra Struttura, chiamata GB_IMG_OWNER e contenuta nel medesimo file header contenente la Struttura in oggetto: GB_IMG .


Per leggere con Gambas nei membri sopra indicati, potremo procedere come segue (esempio con un sistema operativo a 64-bit):

Public Sub Form_Open()
 
 Dim im As Image  
 Dim p1, p2, p3, data As Pointer
 Dim i As Integer
 
 im = Image.Load("/percorso/del/file/immagine")
  
' Entra nella Struttura "GB_IMG"
 p1 = Object.Address(im)
  
' Entra in "GB_BASE ob", ossia nella Struttura "CLASS":
 p2 = Pointer@(p1)     
 ' Dereferenzia il secondo membro "int ref":
      Print Int@(p2 + 8)
 ' Dereferenzia il terzo membro "int ref":
      Print Int@(p2 + 12)
 ' Dereferenzia il quinto membro "char *name":
      Print String@(Pointer@(p2 + 24))
    
 Print Int@(p1 + 24)          ' Dereferenzia il terzo membro "int width"
 Print Int@(p1 + 28)          ' Dereferenzia il quarto membro "int height"
 Print Int@(p1 + 32)          ' Dereferenzia il quinto membro "int format"

' Entra nel sesto membro "GB_IMG_OWNER *owner", ossia nella Struttura "GB_IMG_OWNER":
 p3 = Pointer@(p1 + 40)
 ' Dereferenzia il primo membro "const char *name":
      Print String@(Pointer@(p3))
 ' Dereferenzia il secondo membro "int format":
      Print Int@(p3 + 8)
  
 Print "----------------"
  
' Entra nel secondo membro "unsigned char *data":
 data = Pointer@(p1 + ((SizeOf(gb.Pointer) * 2)))
 If data == 0 Then Error.Raise("Dati immagine inesistenti !")
' Legge tutti i dati grezzi. La quantità è definita dal prodotto delle dimensioni width e heigth dell'immagine moltiplicato per il valore del formato espresso in bit.
 For i = 0 To ((Int@(p1 + 32) / 8) * Int@(p1 + 24) * Int@(p1 + 28)) - 1
   Print i, Hex(Byte@(data + i), 2)
 Next 

End


Note

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