Differenze tra le versioni di "Gestire un oggetto Image agendo direttamente sulle risorse dei sorgenti Gambas"
(Creata pagina con "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 '...") |
|||
(18 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'', 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>[[[#Note|Nota 1]]]</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; | + | 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 16: | Riga 17: | ||
} | } | ||
GB_IMG; | GB_IMG; | ||
− | Agendo - in lettura | + | Agendo - in ''lettura'' ed in ''scrittura'' - su questa ''Struttura'', possiamo ottenere dati dall'immagine o scriverne nuovi, così modificandola. |
Riga 27: | Riga 28: | ||
Dim spost As Integer | Dim spost As Integer | ||
− | + | 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) | |
− | + | 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)) | |
<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" | |
<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" | |
<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) | |
<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)))) | |
'''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>") | |
<FONT Color=gray>' ''Punta all'oggetto "Image":''</font> | <FONT Color=gray>' ''Punta all'oggetto "Image":''</font> | ||
− | + | 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)) | |
<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 | |
− | <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>[[[#Note|Nota 2]]]</sup> |
− | + | Write #st, &<FONT Color=#B22222>FF</font>00FFFF 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) | |
<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 | |
− | + | im.Save("/tmp/immagine.png", 100) | |
'''End''' | '''End''' | ||
+ | |||
+ | |||
+ | |||
+ | =Note= | ||
+ | [1] Si rinvia per identico argomento alle seguenti pagine della WIKI: | ||
+ | * [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] | ||
+ | |||
+ | [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:
- Configurazione, organizzazione ed impostazione dell'oggetto Image secondo i 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