Differenze tra le versioni di "Leggere le informazioni di una Image dalle sue risorse dei sorgenti di Gambas"
Riga 1: | Riga 1: | ||
− | Quando viene istanziata e creata una | + | 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 | + | 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 | typedef | ||
struct GB_IMG { | struct GB_IMG { | ||
Riga 35: | Riga 35: | ||
Dim i As Integer | Dim i As Integer | ||
− | + | im = Image.Load("<FONT Color=gray>''/percorso/del/file/immagine''</font>") | |
<FONT Color=gray>' ''Entra nella Struttura "GB_IMG"''</font> | <FONT Color=gray>' ''Entra nella Struttura "GB_IMG"''</font> | ||
− | + | <FONT Color=Blue>p1</font> = Object.Address(im) | |
<FONT Color=gray>' ''Entra in "GB_BASE ob", ossia nella Struttura "CLASS":''</font> | <FONT Color=gray>' ''Entra in "GB_BASE ob", ossia nella Struttura "CLASS":''</font> | ||
− | + | <FONT Color=red>p2</font> = <FONT Color=Blue>Pointer@(p1)</font> | |
− | + | <FONT Color=gray>' ''Dereferenzia il secondo membro "int ref":''</font> | |
− | + | Print <FONT Color=red>Int@(p2 + 8)</font> | |
− | + | <FONT Color=gray>' ''Dereferenzia il terzo membro "int ref":''</font> | |
− | + | Print <FONT Color=red>Int@(p2 + 12)</font> | |
− | + | <FONT Color=gray>' ''Dereferenzia il quinto membro "char *name":''</font> | |
− | + | Print <FONT Color=red>String@(Pointer@(p2 + 24))</font> | |
− | + | Print <FONT Color=Blue>Int@(p1 + 24)</font> <FONT Color=gray>' ''Dereferenzia il terzo membro "int width"''</font> | |
− | + | Print <FONT Color=Blue>Int@(p1 + 28)</font> <FONT Color=gray>' ''Dereferenzia il quarto membro "int height"''</font> | |
− | + | Print <FONT Color=Blue>Int@(p1 + 32)</font> <FONT Color=gray>' ''Dereferenzia il quinto membro "int format"''</font> | |
<FONT Color=gray>' ''Entra nel sesto membro "GB_IMG_OWNER *owner", ossia nella Struttura "GB_IMG_OWNER":''</font> | <FONT Color=gray>' ''Entra nel sesto membro "GB_IMG_OWNER *owner", ossia nella Struttura "GB_IMG_OWNER":''</font> | ||
− | + | <FONT Color=darkgreen>p3</font> = <FONT Color=Blue>Pointer@(p1 + 40)</font> | |
− | + | <FONT Color=gray>' ''Dereferenzia il primo membro "const char *name":''</font> | |
− | + | Print <FONT Color=darkgreen>String@(Pointer@(p3))</font> | |
− | + | <FONT Color=gray>' ''Dereferenzia il secondo membro "int format":''</font> | |
− | + | Print <FONT Color=darkgreen>Int@(p3 + 8)</font> | |
− | + | Print "----------------" | |
<FONT Color=gray>' ''Entra nel secondo membro "unsigned char *data":''</font> | <FONT Color=gray>' ''Entra nel secondo membro "unsigned char *data":''</font> | ||
− | + | data = <FONT Color=Blue>Pointer@(p1 + 16)</font> | |
− | + | If data == 0 Then Error.Raise("Dati immagine inesistenti !") | |
− | <FONT Color=gray>' ''Legge tutti i dati grezzi. La quantità è definita dal prodotto | + | <FONT Color=gray>' ''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.''</font> |
− | + | For i = 0 To (<FONT Color=Blue>(Int@(p1 + 32) / 8) * Int@(p1 + 24) * Int@(p1 + 28)</font>) - 1 | |
− | + | Print i, Hex(Byte@(data + i), 2) | |
− | + | Next | |
− | |||
'''End''' | '''End''' | ||
− | |||
Versione delle 22:53, 22 ott 2021
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 + 16) 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: