Differenze tra le versioni di "Gestire un oggetto Image agendo direttamente sulle risorse dei sorgenti Gambas"
(5 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>[[[#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; // <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...) <FONT Color=gray>Vedi | + | 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=darkgreen>''/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 | |
Riga 61: | Riga 62: | ||
Dim st As Stream | Dim st As Stream | ||
− | + | im = Image.Load("<FONT Color=darkgreen>''/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 dell'immagine, 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 | |
− | |||
Riga 92: | Riga 90: | ||
=Note= | =Note= | ||
[1] Si rinvia per identico argomento alle seguenti pagine della WIKI: | [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 |
Versione attuale delle 14:52, 3 lug 2024
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